4 from pprint import pformat
5 from sfa.generic import Generic
6 from optparse import OptionParser
7 from pprint import PrettyPrinter
8 from sfa.util.xrn import Xrn
9 from sfa.storage.record import SfaRecord
10 from sfa.client.sfi import save_records_to_file
11 pprinter = PrettyPrinter(indent=4)
14 def args(*args, **kwargs):
16 func.__dict__.setdefault('options', []).insert(0, (args, kwargs))
20 class Commands(object):
22 def _get_commands(self):
23 available_methods = []
24 for attrib in dir(self):
25 if callable(getattr(self, attrib)) and not attrib.startswith('_'):
26 available_methods.append(attrib)
27 return available_methods
29 class RegistryCommands(Commands):
31 def __init__(self, *args, **kwds):
32 self.api= Generic.the_flavour().make_api(interface='registry')
35 version = self.api.manager.GetVersion(self.api, {})
36 pprinter.pprint(version)
38 @args('-x', '--xrn', dest='xrn', metavar='<xrn>', help='object hrn/urn')
39 @args('-t', '--type', dest='type', metavar='<type>', help='object type', default=None)
40 def list(self, xrn, type=None):
42 records = self.api.manager.List(self.api, xrn.get_hrn())
43 for record in records:
44 if not type or record['type'] == type:
45 print "%s (%s)" % (record['hrn'], record['type'])
48 @args('-x', '--xrn', dest='xrn', metavar='<xrn>', help='object hrn/urn')
49 @args('-t', '--type', dest='type', metavar='<type>', help='object type', default=None)
50 @args('-o', '--outfile', dest='outfile', metavar='<outfile>', help='save record to file')
51 @args('-f', '--format', dest='format', metavar='<display>', type='choice',
52 choices=('text', 'xml', 'summary'), help='display record in different formats')
53 def show(self, xrn, type=None, format=None, outfile=None):
54 records = self.api.manager.Resolve(self.api, xrn, type, True)
55 for record in records:
56 sfa_record = SfaRecord(dict=record)
57 sfa_record.dump(format)
59 save_records_to_file(outfile, records)
61 def register(self, record):
64 def update(self, record):
67 @args('-x', '--xrn', dest='xrn', metavar='<xrn>', help='object hrn/urn')
68 @args('-t', '--type', dest='type', metavar='<type>', help='object type', default=None)
69 def remove(self, xrn, type=None):
71 self.api.manager.Remove(self.api, xrn)
73 def credential(self, xrn):
79 class CerficiateCommands(Commands):
81 def import_records(self, xrn):
84 def export(self, xrn):
87 def display(self, xrn):
93 class AggregateCommands(Commands):
95 def __init__(self, *args, **kwds):
96 self.api= Generic.the_flavour().make_api(interface='aggregate')
99 version = self.api.manager.GetVersion(self.api, {})
100 pprinter.pprint(version)
103 print self.api.manager.ListSlices(self.api, [], {})
105 @args('-x', '--xrn', dest='xrn', metavar='<xrn>', help='object hrn/urn')
106 def status(self, xrn):
107 urn = Xrn(xrn, 'slice').get_urn()
108 status = self.api.manager.SliverStatus(self.api, urn, [], {})
109 pprinter.pprint(status)
111 def resources(self, xrn):
114 def create(self, xrn, rspec):
117 def delete(self, xrn):
120 def start(self, xrn):
126 def reset(self, xrn):
133 class SliceManagerCommands(AggregateCommands):
135 def __init__(self, *args, **kwds):
136 self.api= Generic().make_api(interface='slicemgr')
139 CATEGORIES = {'registry': RegistryCommands,
140 'aggregate': AggregateCommands,
141 'slicemgr': SliceManagerCommands}
144 argv = copy.deepcopy(sys.argv)
145 script_name = argv.pop(0)
147 print script_name + " category action [<args>]"
148 print "Available categories:"
153 category = argv.pop(0)
154 usage = "%%prog %s action <args> [options]" % (category)
155 parser = OptionParser(usage=usage)
156 command_class = CATEGORIES[category]
157 command_instance = command_class()
158 actions = command_instance._get_commands()
160 if hasattr(command_instance, '__call__'):
162 command = command_instance.__call__
164 print script_name + " category action [<args>]"
165 print "Available actions for %s category:" % category
171 command = getattr(command_instance, action)
173 options = getattr(command, 'options', [])
174 usage = "%%prog %s %s <args> [options]" % (category, action)
175 parser = OptionParser(usage=usage)
176 for arg, kwd in options:
177 parser.add_option(*arg, **kwd)
178 (opts, cmd_args) = parser.parse_args(argv)
179 cmd_kwds = vars(opts)
181 # dont overrride meth
182 for k, v in cmd_kwds.items():
187 command(*cmd_args, **cmd_kwds)
190 print "Possible wrong number of arguments supplied"
191 print command.__doc__
196 print "Command failed, please check log for more info"
200 if __name__ == '__main__':