configurationengine/source/cone/storage/webstorage.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
## 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
# @author Teemu Rytkonen
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
import getpass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
import StringIO
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import copy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import httplib
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
import urllib, urllib2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
import simplejson
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
import posixpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
from cone.public import *
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    31
from cone.carbon import persistentjson, model, resourcemapper
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
from cone.storage import authenticate
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
class WebStorage(api.Storage):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    A general base class for all storage type classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    @param path : the reference to the root of the storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    def __init__(self, path, mode="a", **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        api.Storage.__init__(self,path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        self.mode = mode
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        self.extapi = CarbonExtapi(path, **kwargs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        self.persistentmodule = persistentjson
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        # resource cache is a intermediate solution to create a mapping between carbon objects and Configuration project
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        self._resource_cache = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    def _create_resource(self, path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
        Create a new resource (configuration|featurelist) to carbon storage.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        # Test the path, whether it is a featurelist or configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
            object_type = object.meta.get('type')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        except (TypeError,AttributeError):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    58
            logging.getLogger('cone').info('Cannot dump configuration %s to webstorage without a type.' % path)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
            return False
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    60
        carbonpath = resourcemapper.CarbonResourceMapper().map_confml_resource(object_type, path)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        if object_type == 'featurelist':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
            # Create a featurelist 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
            success = self.extapi.create_featurelist(carbonpath, object)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
            if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
                self.resource_cache.add_resource_link(path, carbonpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
            return success
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
            # Create a configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
            success = self.extapi.create_configuration(carbonpath, object)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
            if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
                self.resource_cache.add_resource_link(path, carbonpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
            return success
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
    def supported_storage(cls,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        Class method for determing if the given clas supports a storage by given path. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        E.g. http://foo.com/
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        @param path:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        @return: Boolean value. True if the storage of the path is supported. False if not.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        if path.startswith('http://'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
    def resource_cache(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        Returns a resource cache dictionary of all the resources inside the Carbon storage. Works as an intermediate 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        solution to link Configuration project concepts to Carbon storage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        if not self._resource_cache: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
            self._resource_cache = ResourceCache()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    96
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    97
                reslist = self.extapi.list_resources("/", True)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    98
            except urllib2.HTTPError, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    99
                print e
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   100
                return []
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
            # Append all resources to resource cache
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
            for res in reslist:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
                self._resource_cache.add_resource(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
#                    if isinstance(res, model.ConfigurationResource):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
#                        self._resource_cache.add_configuration(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
#                    elif isinstance(res, model.FeatureListResource):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
#                        self._resource_cache.add_featurelist(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        return self._resource_cache
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   110
    def list_resources(self,path, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        find the resources under certain path/path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        @param path : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        Default value is False. Set to True to enable recursion.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        @param empty_folders: parameters that defined whether empty folders are included. This parameter is ignored 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        in WebStorage. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   119
        return self.resource_cache.list_resources(path, kwargs.get('recurse', False))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
    def open_resource(self,path,mode="r"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
        path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        if self.resource_cache.get_resource_object(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
            return self.resource_cache.get_resource_object(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        elif self.resource_cache.get_resource_link(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
            path = self.resource_cache.get_resource_link(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
#        path = path.replace(".confml", ".configuration")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
#        path = utils.resourceref.join_refs([self.get_current_path(), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
            if self.get_mode(mode) == self.MODE_READ:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
                strio = self.extapi._get_stringio_from_path(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
            elif self.get_mode(mode) == self.MODE_APPEND:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
                strio = self.extapi._get_stringio_from_path(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
                strio.seek(0, os.SEEK_END)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
            elif self.get_mode(mode) == self.MODE_WRITE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
                strio = StringIO.StringIO()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
                raise StorageException("Unrecognized mode %s" % mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
            res = WebResource(self,path,mode,strio)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
            self.__opened__(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
            return res
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
            raise exceptions.NotResource("The given resource is not found %s" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
    def is_resource(self,path):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   148
        ret= self.resource_cache.is_resource(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   149
        if not ret:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   150
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   151
                mapped = self.resource_cache.get_mapped_resource(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   152
                ret = self.extapi.is_resource(mapped)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   153
            except Exception:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   154
                pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   155
        return ret
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
#        path = path.replace(".confml", ".configuration")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
#        path = utils.resourceref.join_refs([self.get_current_path(), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
#        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
#            query = urllib.quote(self._get_action_url('is_resource', path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
#            self.conn.request("GET", query)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
#            resp = self.conn.getresponse()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
#            reader = persistentjson.HasResourceReader()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
#            return reader.loads(resp.read())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
#        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
#            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
    def save_resource(self, res):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        Close resource is no-operation action with webstorage for now
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
    def close_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        Close resource is no-operation action with webstorage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
    def export_resources(self, paths, storage, empty_folders=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
        for path in paths:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
            if not self.is_resource(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
                logging.getLogger('cone').warning("The given path is not a Resource in this storage %s! Ignoring from export!" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
            wres = storage.open_resource(path,'wb')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
            res  = self.open_resource(path,"rb")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
            wres.write(res.read())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
            wres.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
            res.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
    def unload(self, path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        Dump a given object to the storage (reference is fetched from the object)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
        @param object: The object to dump to the storage, which is expected to be an instance 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        of Base class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        # Add the current path in front of the given path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        path = utils.resourceref.join_refs([self.get_current_path(), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        print "unload %s" % path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
        if not isinstance(object, api.Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
            raise exceptions.StorageException("Cannot dump object type %s" % object.__class__)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
        # Skip the unload storing to storage if the storage is opened in read mode
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
        if self.get_mode(self.mode) != api.Storage.MODE_READ:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
            if self.resource_cache.get_resource_link(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
                path = self.resource_cache.get_resource_link(path)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   205
            elif self.is_resource(path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   206
                 path = self.resource_cache.get_mapped_resource(path)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
                """ otherwise create the new resource first before update"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
                if self._create_resource(path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
                    path = self.resource_cache.get_resource_link(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
                    # Creation failed
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   213
                    logging.getLogger('cone').info('Creation of %s resource failed' % path)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
                    return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
            data = persistentjson.dumps(object)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
            self.extapi.update_resource(path, data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
            raise exceptions.StorageException("Cannot dump object to readonly storage")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        return
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   220
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   221
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
    def load(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
        Load resource from a path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
        # Check if the object is already cached or has a cached link to another resource to load
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
        path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        print "load %s" % path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
        if self.resource_cache.get_resource_link(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
            path = self.resource_cache.get_resource_link(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
        elif self.resource_cache.get_mapped_resource(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
            path = self.resource_cache.get_mapped_resource(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        elif not utils.resourceref.get_ext(path) == "confml":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
            raise exceptions.StorageException("Cannot load reference type %s" % utils.resourceref.get_ext(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
            # Add the current path in front of the given path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
            path = utils.resourceref.join_refs([self.get_current_path(), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
            if not self.is_resource(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
                raise exceptions.NotResource("No such %s resource!" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        res = self.open_resource(path,"r")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
        # read the resource with persistentmodule
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
            obj = self.persistentmodule.loads(res.read())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
            #obj.set_path(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
            res.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
            return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
        except exceptions.ParseError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
            logging.getLogger('cone').error("Resource %s parsing failed with exception: %s" % (path,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
            # returning an empty config in case of xml parsing failure.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
            return api.Configuration(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        """ No operation in web storage close """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
class WebResource(api.Resource):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
    def __init__(self,storage,path,mode,handle):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        api.Resource.__init__(self,storage,path,mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        self.handle = handle
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
    def read(self,bytes=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        if bytes == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
            return self.handle.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
            return self.handle.read(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
    def write(self,string):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
        if self.get_mode() == api.Storage.MODE_READ:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
            raise exceptions.StorageException("Writing attempted to %s in read-only mode." % self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
            self.handle.write(string)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
    def truncate(self,size=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
    def flush(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
        self.storage.flush_resource(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
        self.storage.close_resource(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
        self.handle.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
    def get_size(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
        if self.get_mode() == api.Storage.MODE_WRITE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
            raise exceptions.StorageException("Reading resource size attempted to %s in write-only mode." % self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
        return len(self.handle.getvalue())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
    def getvalue(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        return self.handle.getvalue()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
class CarbonExtapi(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
    ACTIONS = { 'open_resource' : 'get_resource',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
                'list_resources' : 'list_resources',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
                'is_resource' : 'has_resource',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
                'put_resource' : 'put_resource',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
                'update_resource' : 'update_resource'   }
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
    A general container for Carbon extapi action
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
    def __init__(self, path, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        self.server_path = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        self.service_path = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        if path.startswith('http://'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
            path = path.replace('http://','',1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        pathelems = path.split('/',1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        self.server_path = pathelems[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        if len(pathelems) > 1: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
            self.service_path = pathelems[1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        self._username = kwargs.get('username', None)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   316
        self._password = kwargs.get('password', None)     
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
        authhandler = authenticate.CarbonAuthHandler()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   318
        authhandler.add_username_func(self.get_username)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   319
        authhandler.add_password_func(self.get_password)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        self.conn = urllib2.build_opener(urllib2.HTTPCookieProcessor, authhandler, urllib2.ProxyHandler({}))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   322
    def get_username(self):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
        if self._username == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
            self._username = getpass.getuser()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        return self._username 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   327
    def get_password(self):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        if self._password == None:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   329
            self._password = getpass.getpass("Password (%s):" % self._username)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        return self._password
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
    def checklogin(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        Checks that we are logged in by loading the main page.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        If we are not logged in it will redirect us to login page.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        loginurl = "http://%(host)s/" % dict(host=self.server_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        loginreq = urllib2.Request(loginurl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        print 'Checking login by opening URL %s ...' % loginurl
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
            resp = self.conn.open(loginreq)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        except urllib2.URLError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
            print str(e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
    def _get_stringio_from_path(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        return a StringIO object containing the data under a given path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
        @return: StringIO buffer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
        @raise exception.NotResource: if the resource under path is not found 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
        path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
        action_url = self._get_action_url('open_resource', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
        req = urllib2.Request(action_url)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
            bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
            strio = StringIO.StringIO(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
            return strio
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        except urllib2.HTTPError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
            raise exceptions.NotResource("The given path %s could not be retrived from this storage. Server returned status %s." % (path, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
    def _get_action_url(self, action, path, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
        path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        return "%s/%s/%s" % (self.path,self.ACTIONS[action], urllib.quote(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
    def list_resources_for_type(self,path,type, recurse=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
        find the resources under certain path/path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
        @param path : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
        @param type : resources for particular carbon specific type. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        Default value is False. Set to True to enable recursion.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
            path = utils.resourceref.join_refs([path,'.'+type])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
            query = self._get_action_url('list_resources', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
            req = urllib2.Request(query)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
                reader = persistentjson.ResourceListReader()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
                reslist = reader.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
                return reslist
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
                return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
    def list_resources(self,path, recurse=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
        find the resources under certain path/path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
        @param path : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
        Default value is False. Set to True to enable recursion.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
            query = self._get_action_url('list_resources', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
            req = urllib2.Request(query)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
                bytes = resp.read()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   406
                if bytes:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   407
                    reslist = simplejson.loads(bytes)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   408
                    return reslist.get('resources',[])
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
                return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   414
    def is_resource(self, path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   415
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   416
            query = self._get_action_url('is_resource', path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   417
            req = urllib2.Request(query)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   418
            resp = self.conn.open(req)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   419
            if resp.code == httplib.OK:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   420
                reader = persistentjson.HasResourceReader()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   421
                ret = resp.read()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   422
                return reader.loads(ret)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   423
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   424
                return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   425
        except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   426
            return False
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   428
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
    def update_resource(self, path, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
        Update a resource to carbon. The resource can be a CarbonConfiguration or FeatureList object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
        @param object: The object which is dumped to dict with persistentjson and then updated to server. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
            query = self._get_action_url('update_resource', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
            jsondata = simplejson.dumps(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
            encdata = urllib.urlencode({'data' : jsondata})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
            req = urllib2.Request(query, encdata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
                respdata = simplejson.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
                success = respdata.get('success') == True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
                if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
                    logging.getLogger('cone').info('Carbon update succeeds to path %s.' % (respdata.get('path')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
                else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   449
                    logging.getLogger('cone').error('Carbon update %s failed!' % (path))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   450
                if respdata.get('errors'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   451
                    formatted_err = "" 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   452
                    for error in respdata.get('errors'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   453
                        formatted_err += "%s: %s\n" % (error,respdata.get('errors')[error])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   454
                    logging.getLogger('cone').info('Carbon update to path %s returned %s' % (respdata.get('path'),formatted_err))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
                return success
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
                logging.getLogger('cone').error('Carbon update %s failed %s: %s' % (path,resp.code, resp))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
                return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
        except urllib2.HTTPError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
    def create_feature(self,path, feature, parent=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
        Create new Carbon feature based on Feature object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
        @param path: The path to the featurelist where the feature is created. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        @param feature: The feature object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
        @param parent: A possible parent feature ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
            query = self._get_action_url('put_resource', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
            data = persistentjson.dumps(feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
            if parent:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
                data['parent'] = parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
            jsondata = simplejson.dumps(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
            encdata = urllib.urlencode({'data' : jsondata})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
            req = urllib2.Request(query, encdata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
                respdata = simplejson.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
                success = respdata.get('success') == True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
                if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
                    logging.getLogger('cone').info('New Carbon feature created to path %s.' % (respdata.get('path')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
                    logging.getLogger('cone').error('Feature %s creation failed %s' % (feature.fqr,respdata.get('errors')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
                return success
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
                logging.getLogger('cone').error('Feature %s creation failed %s: %s' % (feature.fqr,resp.code, resp))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
                return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
        except urllib2.HTTPError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
    def create_featurelist(self, path, featurelist):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
        Create new Carbon featurelist to carbon.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
        @param featurelist: The FeatureList object which is created. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
        @return: tuple (success, created_path) where success indicates the success of the operation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
        and created_path is the newly created featurelist path on success.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
            query = self._get_action_url('put_resource', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
            data = persistentjson.FeatureListCreateWriter().dumps(featurelist)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
            jsondata = simplejson.dumps(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
            encdata = urllib.urlencode({'data' : jsondata})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
            req = urllib2.Request(query, encdata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
                respdata = simplejson.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
                success = respdata.get('success') == True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
                newpath = respdata.get('path')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
                if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
                    logging.getLogger('cone').info('New Carbon featurelist created to path %s.' % (newpath))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
                    logging.getLogger('cone').error('FeatureList %s creation failed %s' % (featurelist.path,respdata.get('errors')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
                return (success, newpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
                logging.getLogger('cone').error('FeatureList %s creation failed %s: %s' % (featurelist.path,resp.code, resp))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
                return (False,'')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
        except urllib2.HTTPError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
            return (False,'')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
    def create_configuration(self, path, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
        Create new Carbon configuration to carbon.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
        @param path: The path to the configuration 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
        @param configuration: The CarbonConfiguration object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
        @return: tuple (success, created_path) where success indicates the success of the operation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
        and created_path is the newly created configuration path on success.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
            query = self._get_action_url('put_resource', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
            data = persistentjson.ConfigurationCreateWriter().dumps(configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
            jsondata = simplejson.dumps(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
            encdata = urllib.urlencode({'data' : jsondata})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
            req = urllib2.Request(query, encdata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
                respdata = simplejson.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
                success = respdata.get('success') == True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
                newpath = respdata.get('path')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
                if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
                    logging.getLogger('cone').info('New Carbon configuration created to path %s.' % (newpath))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
                    logging.getLogger('cone').error('CarbonConfiguration %s creation failed %s' % (configuration.path,respdata.get('errors')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
                return (success, newpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
                logging.getLogger('cone').error('CarbonConfiguration %s creation failed %s: %s' % (configuration.path,resp.code, resp))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
                return (False,'')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
        except urllib2.HTTPError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
            return (False,'')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
class ResourceCache(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
    Resource cache maintains a list of ConE resource names and their actual links to Carbon resources.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
        self._cache = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
    def add_configuration(self, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
        Add a list of Carbon configurations. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
        # Create the configuration as a layer and configuration root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
        self._cache[configuration.get_path()] = configuration.path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
        rootconf_path = configuration.name+'.confml'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
        rootconf = model.CarbonConfiguration(rootconf_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
        rootconf.include_configuration(configuration.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
        self._cache[rootconf_path] = rootconf
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
    def add_featurelist(self, featurelist):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
        Add a list of Carbon configurations. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
        # Add the feature list under feature list folder 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
        self._cache["featurelists/"+featurelist.get_path()] = featurelist.get_carbon_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
    def add_resource(self, resourcepath):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
        Add a resource 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   595
        confmlpath = resourcemapper.CarbonResourceMapper().map_carbon_resource(resourcepath)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
        self._cache[confmlpath] = resourcepath 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
    def list_resources(self, path, recurse=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        List ConE resources under certain path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
        resources = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
        path = utils.resourceref.insert_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
        for res in self._cache.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
            (respath,resname) = posixpath.split(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
            respath = utils.resourceref.insert_begin_slash(respath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
            if recurse:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
                if posixpath.normpath(respath).startswith(posixpath.normpath(path)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
                     resources.append(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
                if posixpath.normpath(respath) == posixpath.normpath(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
                     resources.append(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
        return resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
    def is_resource(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
        return self._cache.has_key(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
    def get_resource_link(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   619
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
        Get a the actual Carbon resource link if it is found from cached storage. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   622
        linkpath = self._cache.get(path, None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   623
        if isinstance(linkpath, str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   624
             return linkpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   625
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   626
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   627
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   628
    def get_mapped_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   629
        # Try to make a carbon like resource path for a confml resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   630
        if path.startswith('featurelists'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   631
            object_type = 'featurelist'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   632
        elif path.endswith('/root.confml'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   633
            object_type = 'configurationlayer'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   634
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   635
            object_type = 'configurationroot'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   636
        carbonpath = resourcemapper.CarbonResourceMapper().map_confml_resource(object_type, path)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   637
        return carbonpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   638
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   639
    def add_resource_link(self,link, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   640
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   641
        Add a actual Carbon resource link. The link is the key which returns path when asked from get_resource_link.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   642
        @param link: is linking path to the actual carbon resource path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   643
        @param path: is the actual carbon path  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   644
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   645
        self._cache[link] = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   646
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   647
    def get_resource_object(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   648
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   649
        Get a the actual cached Carbon object if it is found. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   650
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   651
        cachebj = self._cache.get(path, None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   652
        if isinstance(cachebj, model.CarbonConfiguration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   653
             return cachebj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   654
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   655