+ # need to pass along user keys to the aggregate.
+ # users = [
+ # { urn: urn:publicid:IDN+emulab.net+user+alice
+ # keys: [<ssh key A>, <ssh key B>]
+ # }]
+ users = []
+ slice_records = self.registry.Resolve(slice_urn, [user_cred.save_to_string(save_parents=True)])
+ if slice_records and 'researcher' in slice_records[0] and slice_records[0]['researcher']!=[]:
+ slice_record = slice_records[0]
+ user_hrns = slice_record['researcher']
+ user_urns = [hrn_to_urn(hrn, 'user') for hrn in user_hrns]
+ user_records = self.registry.Resolve(user_urns, [user_cred.save_to_string(save_parents=True)])
+
+ if 'sfa' not in server_version:
+ users = pg_users_arg(user_records)
+ rspec = RSpec(rspec)
+ rspec.filter({'component_manager_id': server_version['urn']})
+ rspec = RSpecConverter.to_pg_rspec(rspec.toxml(), content_type='request')
+ creds = [slice_cred]
+ else:
+ users = sfa_users_arg(user_records, slice_record)
+ creds = [slice_cred]
+ if delegated_cred:
+ creds.append(delegated_cred)
+ # do not append users, keys, or slice tags. Anything
+ # not contained in this request will be removed from the slice
+ options = {'append': False}
+ if self.server_supports_options_arg(server):
+ options['call_id'] = unique_call_id()
+ call_args = [slice_urn, creds, rspec, users, options]
+ result = server.CreateSliver(*call_args)
+ value = ReturnValue.get_value(result)
+ if opts.file is None:
+ print value
+ else:
+ save_rspec_to_file (value, opts.file)
+ return value
+
+ def delete(self, opts, args):
+ """
+ delete named slice (DeleteSliver)
+ """
+ slice_hrn = args[0]
+ slice_urn = hrn_to_urn(slice_hrn, 'slice')
+ slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
+ creds = [slice_cred]
+ if opts.delegate:
+ delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority))
+ creds.append(delegated_cred)
+ server = self.server_proxy_from_opts(opts)
+ call_args = [slice_urn, creds]
+ if self.server_supports_options_arg(server):
+ options = {'call_id': unique_call_id()}
+ call_args.append(options)
+ return server.DeleteSliver(*call_args)
+
+ def status(self, opts, args):
+ """
+ retrieve slice status (SliverStatus)
+ """
+ slice_hrn = args[0]
+ slice_urn = hrn_to_urn(slice_hrn, 'slice')
+ slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
+ creds = [slice_cred]
+ if opts.delegate:
+ delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority))
+ creds.append(delegated_cred)
+ server = self.server_proxy_from_opts(opts)
+ call_args = [slice_urn, creds]
+ if self.server_supports_options_arg(server):
+ options = {'call_id': unique_call_id()}
+ call_args.append(options)
+ result = server.SliverStatus(*call_args)
+ value = ReturnValue.get_value(result)
+ print value
+ if opts.file:
+ save_variable_to_file(value, opts.file, opts.fileformat)
+
+ def start(self, opts, args):
+ """
+ start named slice (Start)
+ """
+ slice_hrn = args[0]
+ slice_urn = hrn_to_urn(slice_hrn, 'slice')
+ slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
+ creds = [slice_cred]
+ if opts.delegate:
+ delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority))
+ creds.append(delegated_cred)
+ server = self.server_proxy_from_opts(opts)
+ return server.Start(slice_urn, creds)
+
+ def stop(self, opts, args):
+ """
+ stop named slice (Stop)
+ """
+ slice_hrn = args[0]
+ slice_urn = hrn_to_urn(slice_hrn, 'slice')
+ slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
+ creds = [slice_cred]
+ if opts.delegate:
+ delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority))
+ creds.append(delegated_cred)
+ server = self.server_proxy_from_opts(opts)
+ return server.Stop(slice_urn, creds)
+
+ # reset named slice
+ def reset(self, opts, args):
+ """
+ reset named slice (reset_slice)
+ """
+ slice_hrn = args[0]
+ slice_urn = hrn_to_urn(slice_hrn, 'slice')
+ server = self.server_proxy_from_opts(opts)
+ slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
+ creds = [slice_cred]
+ if opts.delegate:
+ delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority))
+ creds.append(delegated_cred)
+ return server.reset_slice(creds, slice_urn)
+
+ def renew(self, opts, args):
+ """
+ renew slice (RenewSliver)
+ """
+ slice_hrn = args[0]
+ slice_urn = hrn_to_urn(slice_hrn, 'slice')
+ server = self.server_proxy_from_opts(opts)
+ slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
+ creds = [slice_cred]
+ if opts.delegate:
+ delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority))
+ creds.append(delegated_cred)
+ time = args[1]
+
+ call_args = [slice_urn, creds, time]
+ if self.server_supports_options_arg(server):
+ options = {'call_id': unique_call_id()}
+ call_args.append(options)
+ result = server.RenewSliver(*call_args)
+ value = ReturnValue.get_value(result)
+ return value
+