X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=6f2d5b71948a5634ed01cd8fc16fa9634d7d98f8;hb=108f6d000af6517d3b22501255b377a83568b946;hp=5f7aefe52877a3009fc92ce9db905eb1d862ad11;hpb=4374db469737739359e48b0d55b0d7ad6cae50aa;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 5f7aefe5..6f2d5b71 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -28,7 +28,8 @@ from sfa.util.config import Config from sfa.util.version import version_core from sfa.util.cache import Cache -from sfa.storage.record import SfaRecord, UserRecord, SliceRecord, NodeRecord, AuthorityRecord +#from sfa.storage.record import SfaRecord, UserRecord, SliceRecord, NodeRecord, AuthorityRecord +from sfa.storage.persistentobjs import RegRecord from sfa.rspecs.rspec import RSpec from sfa.rspecs.rspec_converter import RSpecConverter @@ -119,15 +120,15 @@ def save_records_to_file(filename, recordList, format="xml"): f = open(filename, "w") f.write("\n") for record in recordList: - record = SfaRecord(dict=record) - f.write('\n') + record_obj=RegRecord (dict=record) + f.write('\n') f.write("\n") f.close() elif format == "hrnlist": f = open(filename, "w") for record in recordList: - record = SfaRecord(dict=record) - f.write(record.get_name() + "\n") + record_obj=RegRecord (dict=record) + f.write(record.hrn + "\n") f.close() else: # this should never happen @@ -135,15 +136,19 @@ def save_records_to_file(filename, recordList, format="xml"): def save_record_to_file(filename, record): if record['type'] in ['user']: - record = UserRecord(dict=record) + # UserRecord + record = RegRecord(dict=record) elif record['type'] in ['slice']: - record = SliceRecord(dict=record) + # SliceRecord + record = RegRecord(dict=record) elif record['type'] in ['node']: - record = NodeRecord(dict=record) + # NodeRecord + record = RegRecord(dict=record) elif record['type'] in ['authority', 'ma', 'sa']: - record = AuthorityRecord(dict=record) + # AuthorityRecord + record = RegRecord(dict=record) else: - record = SfaRecord(dict=record) + record = RegRecord(dict=record) str = record.save_to_string() f=codecs.open(filename, encoding='utf-8',mode="w") f.write(str) @@ -156,7 +161,8 @@ def load_record_from_file(filename): f=codecs.open(filename, encoding="utf-8", mode="r") str = f.read() f.close() - record = SfaRecord(string=str) + record = RegRecord() + record.load_from_xml(str) return record @@ -165,7 +171,8 @@ def unique_call_id(): return uuid.uuid4().urn class Sfi: - required_options=['verbose', 'debug', 'registry', 'sm', 'auth', 'user'] + # dirty hack to make this class usable from the outside + required_options=['verbose', 'debug', 'registry', 'sm', 'auth', 'user', 'user_private_key'] @staticmethod def default_sfi_dir (): @@ -255,8 +262,6 @@ class Sfi: # user specifies remote aggregate/sm/component if command in ("resources", "slices", "create", "delete", "start", "stop", "restart", "shutdown", "get_ticket", "renew", "status"): - parser.add_option("-c", "--component", dest="component", default=None, - help="component hrn") parser.add_option("-d", "--delegate", dest="delegate", default=None, action="store_true", help="Include a credential delegated to the user's root"+\ @@ -268,10 +273,15 @@ class Sfi: help="type filter ([all]|user|slice|authority|node|aggregate)", choices=("all", "user", "slice", "authority", "node", "aggregate"), default="all") - # display formats if command in ("resources"): + # rspec version parser.add_option("-r", "--rspec-version", dest="rspec_version", default="SFA 1", help="schema type and version of resulting RSpec") + # disable/enable cached rspecs + parser.add_option("-c", "--current", dest="current", default=False, + action="store_true", + help="Request the current rspec bypassing the cache. Cached rspecs are returned by default") + # display formats parser.add_option("-f", "--format", dest="format", type="choice", help="display format ([xml]|dns|ip)", default="xml", choices=("xml", "dns", "ip")) @@ -551,6 +561,8 @@ class Sfi: self.sliceapi_proxy=SfaServerProxy(cm_url, self.private_key, self.my_gid) else: # otherwise use what was provided as --sliceapi, or SFI_SM in the config + if not self.sm_url.startswith('http://') or self.sm_url.startswith('https://'): + self.sm_url = 'http://' + self.sm_url self.logger.info("Contacting Slice Manager at: %s"%self.sm_url) self.sliceapi_proxy = SfaServerProxy(self.sm_url, self.private_key, self.my_gid, timeout=self.options.timeout, verbose=self.options.debug) @@ -708,19 +720,24 @@ or version information about sfi itself self.logger.error("No record of type %s"% options.type) for record in records: if record['type'] in ['user']: - record = UserRecord(dict=record) + # UserRecord + record = RegRecord(dict=record) elif record['type'] in ['slice']: - record = SliceRecord(dict=record) + # SliceRecord + record = RegRecord(dict=record) elif record['type'] in ['node']: - record = NodeRecord(dict=record) + # NodeRecord + record = RegRecord(dict=record) elif record['type'].startswith('authority'): - record = AuthorityRecord(dict=record) + # AuthorityRecord + record = RegRecord(dict=record) else: - record = SfaRecord(dict=record) + record = RegRecord(dict=record) + if (options.format == "text"): record.dump() else: - print record.save_to_string() + print record.save_as_xml() if options.file: save_records_to_file(options.file, records, options.fileformat) return @@ -733,7 +750,7 @@ or version information about sfi itself sys.exit(1) record_filepath = args[0] rec_file = self.get_record_file(record_filepath) - record = load_record_from_file(rec_file).as_dict() + record = load_record_from_file(rec_file).todict() return self.registry().Register(record, auth_cred) def update(self, options, args): @@ -815,44 +832,35 @@ or with an slice hrn, shows currently provisioned resources creds.append(self.my_credential_string) if options.delegate: creds.append(self.delegate_cred(cred, get_authority(self.authority))) - - # V2 API - if self.server_supports_options_arg(server): - # with v2 everything goes in options inclusing the subject slice - api_options = {} - if args: - hrn = args[0] - api_options['geni_slice_urn'] = hrn_to_urn(hrn, 'slice') - if options.info: - api_options['info'] = options.info - if options.rspec_version: - version_manager = VersionManager() - server_version = self.get_cached_server_version(server) - if 'sfa' in server_version: - # just request the version the client wants - api_options['geni_rspec_version'] = version_manager.get_version(options.rspec_version).to_dict() - else: - # this must be a protogeni aggregate. We should request a v2 ad rspec - # regardless of what the client user requested - api_options['geni_rspec_version'] = version_manager.get_version('ProtoGENI 2').to_dict() + + # no need to check if server accepts the options argument since the options has + # been a required argument since v1 API + api_options = {} + # always send call_id to v2 servers + api_options ['call_id'] = unique_call_id() + # ask for cached value if available + api_options ['cached'] = True + if args: + hrn = args[0] + api_options['geni_slice_urn'] = hrn_to_urn(hrn, 'slice') + if options.info: + api_options['info'] = options.info + if options.current: + if options.current == True: + api_options['cached'] = False + else: + api_options['cached'] = True + if options.rspec_version: + version_manager = VersionManager() + server_version = self.get_cached_server_version(server) + if 'sfa' in server_version: + # just request the version the client wants + api_options['geni_rspec_version'] = version_manager.get_version(options.rspec_version).to_dict() else: api_options['geni_rspec_version'] = {'type': 'geni', 'version': '3.0'} - # always send call_id to v2 servers - api_options ['call_id'] = unique_call_id() - # ask for cached value if available - api_options ['cached'] = True - # the V2 form - result = server.ListResources (creds, api_options) - # V1 else: - # with an argument - if args: - hrn = args[0] - # xxx looks like we can pass a hrn and not a urn here ?? - # last arg. is a raw call_id when supported - result = server.ListResources (creds, hrn, *self.cis(server)) - else: - result = server.ListResources (creds, *self.cis(server)) + api_options['geni_rspec_version'] = {'type': 'geni', 'version': '3.0'} + result = server.ListResources (creds, api_options) value = ReturnValue.get_value(result) if options.file is None: display_rspec(value, options.format)