configurationengine/source/cone/storage/webstorage.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
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 *
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
from cone.carbon import persistentjson, model
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):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
            logging.getLogger('cone').error('Cannot dump configuration %s to webstorage without a type.' % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        carbonpath = persistentjson.CarbonResourceMapper().map_confml_resource(object_type, path)
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()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
            reslist = self.extapi.list_resources("/", True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
            # Append all resources to resource cache
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
            for res in reslist:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
                self._resource_cache.add_resource(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
#                    if isinstance(res, model.ConfigurationResource):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
#                        self._resource_cache.add_configuration(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
#                    elif isinstance(res, model.FeatureListResource):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
#                        self._resource_cache.add_featurelist(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        return self._resource_cache
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
    def list_resources(self,path, recurse=False, empty_folders=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        find the resources under certain path/path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        @param path : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        @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
   111
        Default value is False. Set to True to enable recursion.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        @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
   113
        in WebStorage. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        return self.resource_cache.list_resources(path,recurse)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
    def open_resource(self,path,mode="r"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        if self.resource_cache.get_resource_object(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
            return self.resource_cache.get_resource_object(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        elif self.resource_cache.get_resource_link(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
            path = self.resource_cache.get_resource_link(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
#        path = path.replace(".confml", ".configuration")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
#        path = utils.resourceref.join_refs([self.get_current_path(), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
            if self.get_mode(mode) == self.MODE_READ:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
                strio = self.extapi._get_stringio_from_path(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
            elif self.get_mode(mode) == self.MODE_APPEND:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
                strio = self.extapi._get_stringio_from_path(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
                strio.seek(0, os.SEEK_END)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
            elif self.get_mode(mode) == self.MODE_WRITE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
                strio = StringIO.StringIO()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
                raise StorageException("Unrecognized mode %s" % mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
            res = WebResource(self,path,mode,strio)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
            self.__opened__(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
            return res
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
            raise exceptions.NotResource("The given resource is not found %s" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
    def is_resource(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
        return self.resource_cache.is_resource(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
#        path = path.replace(".confml", ".configuration")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
#        path = utils.resourceref.join_refs([self.get_current_path(), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
#        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
#            query = urllib.quote(self._get_action_url('is_resource', path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
#            self.conn.request("GET", query)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
#            resp = self.conn.getresponse()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
#            reader = persistentjson.HasResourceReader()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
#            return reader.loads(resp.read())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
#        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
#            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
    def save_resource(self, res):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        Close resource is no-operation action with webstorage for now
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
    def close_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        Close resource is no-operation action with webstorage
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
    def export_resources(self, paths, storage, empty_folders=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        for path in paths:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
            if not self.is_resource(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
                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
   172
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
            wres = storage.open_resource(path,'wb')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
            res  = self.open_resource(path,"rb")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
            wres.write(res.read())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
            wres.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
            res.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
    def unload(self, path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
        Dump a given object to the storage (reference is fetched from the object)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
        @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
   183
        of Base class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
        # Add the current path in front of the given path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        path = utils.resourceref.join_refs([self.get_current_path(), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
        print "unload %s" % path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        if not isinstance(object, api.Configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
            raise exceptions.StorageException("Cannot dump object type %s" % object.__class__)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
        # Skip the unload storing to storage if the storage is opened in read mode
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
        if self.get_mode(self.mode) != api.Storage.MODE_READ:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
            if self.resource_cache.get_resource_link(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
                path = self.resource_cache.get_resource_link(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
                """ otherwise create the new resource first before update"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
                if self._create_resource(path, object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
                    path = self.resource_cache.get_resource_link(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
                    # Creation failed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
                    logging.getLogger('cone').error('Creation of %s resource failed' % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
                    return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
            data = persistentjson.dumps(object)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
            self.extapi.update_resource(path, data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
            raise exceptions.StorageException("Cannot dump object to readonly storage")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
    def load(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        Load resource from a path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
        # 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
   213
        path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
        print "load %s" % path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
        if self.resource_cache.get_resource_link(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
            path = self.resource_cache.get_resource_link(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        elif self.resource_cache.get_mapped_resource(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
            path = self.resource_cache.get_mapped_resource(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        elif not utils.resourceref.get_ext(path) == "confml":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
            raise exceptions.StorageException("Cannot load reference type %s" % utils.resourceref.get_ext(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
            # Add the current path in front of the given path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
            path = utils.resourceref.join_refs([self.get_current_path(), path])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
            if not self.is_resource(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
                raise exceptions.NotResource("No such %s resource!" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
        res = self.open_resource(path,"r")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
        # read the resource with persistentmodule
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
            obj = self.persistentmodule.loads(res.read())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
            #obj.set_path(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
            res.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
            return obj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        except exceptions.ParseError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
            logging.getLogger('cone').error("Resource %s parsing failed with exception: %s" % (path,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
            # returning an empty config in case of xml parsing failure.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
            return api.Configuration(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
        """ No operation in web storage close """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
class WebResource(api.Resource):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
    def __init__(self,storage,path,mode,handle):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
        api.Resource.__init__(self,storage,path,mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
        self.handle = handle
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
    def read(self,bytes=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        if bytes == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
            return self.handle.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
            return self.handle.read(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
    def write(self,string):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
        if self.get_mode() == api.Storage.MODE_READ:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
            raise exceptions.StorageException("Writing attempted to %s in read-only mode." % self.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
            self.handle.write(string)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
    def truncate(self,size=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
    def flush(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        self.storage.flush_resource(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
    def close(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        self.storage.close_resource(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
        self.handle.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
    def get_size(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        if self.get_mode() == api.Storage.MODE_WRITE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
            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
   274
        return len(self.handle.getvalue())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
    def getvalue(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        return self.handle.getvalue()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
class CarbonExtapi(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
    ACTIONS = { 'open_resource' : 'get_resource',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
                'list_resources' : 'list_resources',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
                'is_resource' : 'has_resource',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
                'put_resource' : 'put_resource',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
                'update_resource' : 'update_resource'   }
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
    A general container for Carbon extapi action
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
    def __init__(self, path, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        self.server_path = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
        self.service_path = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        if path.startswith('http://'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
            path = path.replace('http://','',1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        pathelems = path.split('/',1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        self.server_path = pathelems[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
        if len(pathelems) > 1: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
            self.service_path = pathelems[1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        self._username = kwargs.get('username', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        self._password = kwargs.get('password', None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        authhandler = authenticate.CarbonAuthHandler()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        authhandler.add_password(self.username, self.password)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        self.conn = urllib2.build_opener(urllib2.HTTPCookieProcessor, authhandler, urllib2.ProxyHandler({}))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
    def username(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        if self._username == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
            self._username = getpass.getuser()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        return self._username 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
    def password(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        if self._password == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
            self._password = getpass.getpass()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
        return self._password
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
    def checklogin(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        Checks that we are logged in by loading the main page.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
        If we are not logged in it will redirect us to login page.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
        loginurl = "http://%(host)s/" % dict(host=self.server_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        loginreq = urllib2.Request(loginurl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        print 'Checking login by opening URL %s ...' % loginurl
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
            resp = self.conn.open(loginreq)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        except urllib2.URLError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
            print str(e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
    def _get_stringio_from_path(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        return a StringIO object containing the data under a given path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
        @return: StringIO buffer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        @raise exception.NotResource: if the resource under path is not found 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        action_url = self._get_action_url('open_resource', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        req = urllib2.Request(action_url)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
            bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
            strio = StringIO.StringIO(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
            return strio
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        except urllib2.HTTPError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
            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
   349
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
    def _get_action_url(self, action, path, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
        path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
        return "%s/%s/%s" % (self.path,self.ACTIONS[action], urllib.quote(path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
    def list_resources_for_type(self,path,type, recurse=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        find the resources under certain path/path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
        @param path : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
        @param type : resources for particular carbon specific type. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
        @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
   360
        Default value is False. Set to True to enable recursion.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
            path = utils.resourceref.join_refs([path,'.'+type])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
            query = self._get_action_url('list_resources', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
            req = urllib2.Request(query)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
                reader = persistentjson.ResourceListReader()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
                reslist = reader.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
                return reslist
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
                return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
    def list_resources(self,path, recurse=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
        find the resources under certain path/path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
        @param path : reference to path where resources are searched
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
        @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
   383
        Default value is False. Set to True to enable recursion.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
            query = self._get_action_url('list_resources', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
            req = urllib2.Request(query)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
                reslist = simplejson.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
                return reslist.get('resources',[])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
                return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
    def update_resource(self, path, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
        Update a resource to carbon. The resource can be a CarbonConfiguration or FeatureList object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
        @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
   404
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
            query = self._get_action_url('update_resource', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
            jsondata = simplejson.dumps(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
            encdata = urllib.urlencode({'data' : jsondata})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
            req = urllib2.Request(query, encdata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
                respdata = simplejson.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
                success = respdata.get('success') == True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
                if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
                    logging.getLogger('cone').info('Carbon update succeeds to path %s.' % (respdata.get('path')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
                    logging.getLogger('cone').error('Carbon update %s failed %s' % (path,respdata.get('errors')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
                return success
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
                logging.getLogger('cone').error('Carbon update %s failed %s: %s' % (path,resp.code, resp))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
                return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
        except urllib2.HTTPError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
    def create_feature(self,path, feature, parent=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
        Create new Carbon feature based on Feature object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
        @param path: The path to the featurelist where the feature is created. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
        @param feature: The feature object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
        @param parent: A possible parent feature ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
            path = utils.resourceref.remove_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
            query = self._get_action_url('put_resource', path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
            data = persistentjson.dumps(feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
            if parent:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
                data['parent'] = parent
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
            jsondata = simplejson.dumps(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
            encdata = urllib.urlencode({'data' : jsondata})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
            req = urllib2.Request(query, encdata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
                respdata = simplejson.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
                success = respdata.get('success') == True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
                if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
                    logging.getLogger('cone').info('New Carbon feature created to path %s.' % (respdata.get('path')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
                    logging.getLogger('cone').error('Feature %s creation failed %s' % (feature.fqr,respdata.get('errors')))
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('Feature %s creation failed %s: %s' % (feature.fqr,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_featurelist(self, path, featurelist):
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 featurelist to carbon.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
        @param featurelist: The FeatureList object which is created. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        @return: tuple (success, created_path) where success indicates the success of the operation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
        and created_path is the newly created featurelist path on success.
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.FeatureListCreateWriter().dumps(featurelist)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
            jsondata = simplejson.dumps(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
            encdata = urllib.urlencode({'data' : jsondata})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
            req = urllib2.Request(query, encdata)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
            resp = self.conn.open(req)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
            if resp.code == httplib.OK:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
                bytes = resp.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
                respdata = simplejson.loads(bytes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
                success = respdata.get('success') == True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
                newpath = respdata.get('path')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
                if success:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
                    logging.getLogger('cone').info('New Carbon featurelist created to path %s.' % (newpath))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
                    logging.getLogger('cone').error('FeatureList %s creation failed %s' % (featurelist.path,respdata.get('errors')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
                return (success, newpath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
                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
   491
                return (False,'')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
        except urllib2.HTTPError,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
            return (False,'')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
    def create_configuration(self, path, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
        Create new Carbon configuration to carbon.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
        @param path: The path to the configuration 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
        @param configuration: The CarbonConfiguration object
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 configuration 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.ConfigurationCreateWriter().dumps(configuration)
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 configuration 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('CarbonConfiguration %s creation failed %s' % (configuration.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('CarbonConfiguration %s creation failed %s: %s' % (configuration.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
class ResourceCache(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
    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
   533
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
        self._cache = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
    def add_configuration(self, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
        Add a list of Carbon configurations. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
        # Create the configuration as a layer and configuration root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
        self._cache[configuration.get_path()] = configuration.path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
        rootconf_path = configuration.name+'.confml'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
        rootconf = model.CarbonConfiguration(rootconf_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
        rootconf.include_configuration(configuration.get_path())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
        self._cache[rootconf_path] = rootconf
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
    def add_featurelist(self, featurelist):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
        Add a list of Carbon configurations. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
        # Add the feature list under feature list folder 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
        self._cache["featurelists/"+featurelist.get_path()] = featurelist.get_carbon_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
    def add_resource(self, resourcepath):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
        Add a resource 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
        confmlpath = persistentjson.CarbonResourceMapper().map_carbon_resource(resourcepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
        self._cache[confmlpath] = resourcepath 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
    def list_resources(self, path, recurse=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
        List ConE resources under certain path 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
        resources = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
        path = utils.resourceref.insert_begin_slash(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
        for res in self._cache.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
            (respath,resname) = posixpath.split(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
            respath = utils.resourceref.insert_begin_slash(respath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
            if recurse:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
                if posixpath.normpath(respath).startswith(posixpath.normpath(path)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
                     resources.append(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
                if posixpath.normpath(respath) == posixpath.normpath(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
                     resources.append(res)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
        return resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
    def is_resource(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
        return self._cache.has_key(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
    def get_resource_link(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
        Get a the actual Carbon resource link if it is found from cached storage. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
        linkpath = self._cache.get(path, None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
        if isinstance(linkpath, str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
             return linkpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
    def get_mapped_resource(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
        # Try to make a carbon like resource path for a confml resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
        if path.startswith('featurelists'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
            object_type = 'featurelist'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
        elif path.endswith('/root.confml'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
            object_type = 'configurationlayer'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
            object_type = 'configurationroot'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
        carbonpath = persistentjson.CarbonResourceMapper().map_confml_resource(object_type, path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
        return carbonpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
    def add_resource_link(self,link, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
        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
   608
        @param link: is linking path to the actual carbon resource path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
        @param path: is the actual carbon path  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
        self._cache[link] = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
    def get_resource_object(self,path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
        Get a the actual cached Carbon object if it is found. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
        cachebj = self._cache.get(path, None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
        if isinstance(cachebj, model.CarbonConfiguration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   619
             return cachebj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621