RAD is essentially an API to programmatically manage and query different Solaris subsystems like networking, zones, kstat, smf, etc.
Let's see an example on how to use it to list all zones configured on a local system.
# cat zone_list.py #!/usr/bin/python import rad.client as radcli import rad.connect as radcon import rad.bindings.com.oracle.solaris.radm.zonemgr_1 as zbind with radcon.connect_unix() as rc: zones = rc.list_objects(zbind.Zone()) for i in range(0, len(zones)): zone = rc.get_object(zones[i]) print "zone: %s (%S)" % (zone.name, zone.state) for prop in zone.getResourceProperties(zbind.Resource('global')): if prop.name == 'zonename': continue print "\t%-20s : %s" % (prop.name, prop.value) # ./zone_list.py zone: kz1 (configured) zonepath: : brand : solarisk-kz autoboot : false autoshutdown : shutdown bootargs : file-mac-profile : pool : scheduling-class : ip-type : exclusive hostid : 0x44497532 tenant : zone: kz2 (installed) zonepath: : /system/zones/%{zonename} brand : solarisk-kz autoboot : false autoshutdown : shutdown bootargs : file-mac-profile : pool : scheduling-class : ip-type : exclusive hostid : 0x41d45bb tenant :
Or another example to show how to create a new Kernel Zone with autoboot property set to true:
#!/usr/bin/python import sys import rad.client import rad.connect import rad.bindings.com.oracle.solaris.radm.zonemgr_1 as zonemgr class SolarisZoneManager: def __init__(self): self.description = "Solaris Zone Manager" def init_rad(self): try: self.rad_instance = rad.connect.connect_unix() except Exception as reason: print "Cannoct connect to RAD: %s" % (reason) exit(1) def get_zone_by_name(self, name): try: pat = rad.client.ADRGlobPatter({'name# : name}) zone = self.rad_instance.get_object(zonemgr.Zone(), pat) except rad.client.NotFoundError: return None except Exception as reason: print "%s: %s" % (self.__class__.__name__, reason) return None return zone def zone_get_resource_prop(self, zone, resource, prop, filter=None): try: val = zone.getResourceProperties(zonemgr.Resource(resource, filter), [prop]) except rad.client.ObjectError: return None except Exception as reason: print "%s: %s" % (self.__class__.__name__, reason) return None return val[0].value if val else None def zone_set_resource_prop(self, zone, resource, prop, val): current_val = self.zone_get_resource_prop(zone, resource, prop) if current_val is not None and current_cal == val: # the val is already set return 0 try: if current_cal is None: zone.addResource(zonemgr.Resource(resource, [zonemgr.Property(prop, val)])) else: zone.setResourceProperties(zonemgr.Resource(resource), [zonemgr.Property(prop, val)]) except rad.client.ObjectError as err: print "Failed to set %s property on %s resource for zone %s: %s" % (prop, resource, zone.name, err) return 0 return 1 def zone_create(self, name, template): zonemanager = self.rad_instance.get_object(zonemg.ZoneManager()) zonemanager.create(name, None, template) zone = self.get_zone_by_name(name) try: zone.editConfig() self.zone_set_resource_prop(zone, 'global', 'autoboot', true') zone.commitConfig() except Exception as reason: print "%s: %s" % (self.__class__.__name__, reason) return 0 return 1 x = SolarisZoneManager() x.init_rad() if x.zone_create(str(sys.argv[1]), 'SYSsolaris-kz'): print "Zone created succesfully."
There are many simple examples in zonemgr.3rad man page, and what I found very useful is to look at solariszones/driver.py from OpenStack. It is actually very interesting that OpenStack is using RAD on Solaris.
RAD is very powerful, and with more modules being constantly added it is becoming a powerful programmatic API to remotely manage Solaris systems. It is also very useful if you are writing components to a configuration management system for Solaris.
What's the most anticipated RAD module currently missing in stable Solaris? I think it is ZFS module...
Why would one use a non-standard interface for remoting, when a shell program + AWK + SSH can execute and process any command or application one could possibly imagine, without any extra software whatsoever, and that in a completely operating system independent way?
ReplyDeleteYou can actually use connect_ssh() method in RAD which would use ssh underneath.
ReplyDeleteYes, you can always use the standard CLI tooling but it is hardly a programmatic interface and it is actually problematic quite often to catch all error conditions or properly parse output, etc.
The whols idea behind RAD is that you have a programatic interface to multiple subsystems. Now if you want to do it remotely you can but you don't have to use RAD or RAD + TLS, you can actually tunnel it thru ssh.