def should_be_default_for_arch(newservice): ''' Determine if newservice should be the baseservice of default-<arch> (i.e., first service of architecture and aliasable) Input: service object for newly created service Returns: True if default-<arch> alias should be created False otherwise ''' if newservice.image.version < 3: return False services = config.get_all_service_names() make_default = True for service in services: if service == newservice.name: continue svc = AIService(service) try: props = config.get_service_props(service) config.verify_key_properties(service, props) except config.ServiceCfgError as err: # if service is missing keys, print info and skip it print >> sys.stderr, err continue if svc.arch == newservice.arch and svc.image.version >= 3: make_default = False break logging.debug("should_be_default_for_arch service %s, arch=%s, returns %s", newservice.name, newservice.arch, make_default) return make_default
def test_verify_key_properties(self): '''test verify_key_properties''' # success cases props = { config.PROP_SERVICE_NAME: 's1', config.PROP_STATUS: config.STATUS_ON, config.PROP_TXT_RECORD: 'aiwebserver=ais:5555', config.PROP_IMAGE_PATH: '/tmp/myimage' } config.verify_key_properties('s1', props) props = { config.PROP_SERVICE_NAME: 's1', config.PROP_STATUS: config.STATUS_ON, config.PROP_TXT_RECORD: 'aiwebserver=ais:5555', config.PROP_ALIAS_OF: 'mybasesvc' } config.verify_key_properties('s1', props) # failure cases props = {config.PROP_SERVICE_NAME: 's1'} self.assertRaises(config.ServiceCfgError, config.verify_key_properties, 'not_s1', props) props = { config.PROP_SERVICE_NAME: 's1', config.PROP_TXT_RECORD: 'aiwebserver=ais:5555', config.PROP_IMAGE_PATH: '/tmp/myimage' } self.assertRaises(config.ServiceCfgError, config.verify_key_properties, 's1', props) props = { config.PROP_SERVICE_NAME: 's1', config.PROP_STATUS: config.STATUS_ON, config.PROP_IMAGE_PATH: '/tmp/myimage' } self.assertRaises(config.ServiceCfgError, config.verify_key_properties, 's1', props) props = { config.PROP_SERVICE_NAME: 's1', config.PROP_STATUS: config.STATUS_ON, config.PROP_TXT_RECORD: 'aiwebserver=ais5555', config.PROP_IMAGE_PATH: '/tmp/myimage' } self.assertRaises(config.ServiceCfgError, config.verify_key_properties, 's1', props) props = { config.PROP_SERVICE_NAME: 's1', config.PROP_STATUS: config.STATUS_ON, config.PROP_TXT_RECORD: 'aiwebserver=ais:5555' } self.assertRaises(config.ServiceCfgError, config.verify_key_properties, 's1', props)
def get_local_services(services, sname=None): """ Iterates over the local services on a host creating a dictionary with the service name as the key and status, path, architecture, and aliasof as the value. If name is not None then it ensures that only the named service is retrieved. Args services = config.get_all_service_props() name = service name Returns a service dictionary made up of a list of dictionary of services. { service1: [ {'status':on1, 'path':path1, 'arch':arch1, 'aliasof':aliasof1}, ... ], ... } the width of the longest service name the width of the longest aliasof name Raises None """ width = 0 aliasofwidth = 1 sdict = dict() for akey in services: serv = services[akey] servicename = akey # ensure that the current service has the keys we need. # if not, print error, but continue listing other services try: config.verify_key_properties(akey, serv) except config.ServiceCfgError as err: print >> sys.stderr, err continue try: service = AIService(servicename) except VersionError as err: warn_version(err) continue if config.PROP_ALIAS_OF in serv: image_path = service.image.path serv[config.PROP_IMAGE_PATH] = image_path info = dict() # if a service name is passed in then # ensure it matches the current name if not sname or sname == servicename: width = max(len(servicename), width) info['status'] = serv[config.PROP_STATUS] info['path'] = serv[config.PROP_IMAGE_PATH] info['arch'] = which_arch(service) if config.PROP_ALIAS_OF in serv: # have an alias aliasof = serv[config.PROP_ALIAS_OF] else: aliasof = '-' info['aliasof'] = aliasof aliasofwidth = max(len(aliasof), aliasofwidth) if servicename in sdict: slist = sdict[servicename] slist.extend([info]) sdict[servicename] = slist else: sdict[servicename] = [info] return sdict, width, aliasofwidth