def body(self, lines): pan_include(lines, "servicedata/%s/config" % self.service) lines.append("") pan_assign(lines, "instance", self.name) pan_assign(lines, "servers", self.dbobj.server_fqdns) if self.service == 'dns': pan_assign(lines, "server_ips", self.dbobj.server_ips)
def body(self, lines): path = PlenaryServiceInstanceToplevel.template_name(self.dbobj) pan_assign(lines, "/system/services/%s" % self.dbobj.service, StructureTemplate(path)) path = PlenaryServiceClientDefault.template_name(self.dbobj.service) pan_include(lines, path)
def body(self, lines): pan_include(lines, PlenaryServiceToplevel.template_name(self.dbobj.service)) lines.append("") pan_assign(lines, "instance", self.dbobj.name) fqdns = [srv.fqdn for srv in self.dbobj.servers] ips = [srv.ip for srv in self.dbobj.servers if srv.ip] pan_assign(lines, "servers", fqdns) pan_assign(lines, "server_ips", ips)
def body(self, lines): path = PlenaryServiceInstanceServer.template_name(self.dbobj) # TODO: we should export the FQDN, IP address, and service address name # that provides the service # TODO: make it possible to provide multiple instances of the same # service pan_assign(lines, "/system/provides/%s" % self.dbobj.service, StructureTemplate(path)) path = PlenaryServiceServerDefault.template_name(self.dbobj.service) pan_include(lines, path)
def body(self, lines): pan_variable(lines, "PERSONALITY", self.dbobj.name) ## process grns eon_id_map = defaultdict(set) # own == pers level for grn_rec in self.dbobj._grns: eon_id_map[grn_rec.target].add(grn_rec.grn.eon_id) for (target, eon_id_set) in eon_id_map.iteritems(): eon_id_list = list(eon_id_set) eon_id_list.sort() for eon_id in eon_id_list: pan_append(lines, "/system/eon_id_maps/%s" % target, eon_id) archetype = self.dbobj.archetype.name # backward compat for esp reporting if self.config.has_option("archetype_" + archetype, "default_grn_target"): default_grn_target = self.config.get("archetype_" + archetype, "default_grn_target") eon_id_set = eon_id_map[default_grn_target] eon_id_list = list(eon_id_set) eon_id_list.sort() for eon_id in eon_id_list: pan_append(lines, "/system/eon_ids", eon_id) pan_assign(lines, "/system/personality/owner_eon_id", self.dbobj.owner_eon_id) ## include pre features path = PlenaryPersonalityPreFeature.template_name(self.dbobj) pan_include_if_exists(lines, path) ## process parameter templates pan_include_if_exists(lines, "personality/config") pan_assign(lines, "/system/personality/name", self.dbobj.name) if self.dbobj.host_environment.name != 'legacy': pan_assign(lines, "/system/personality/host_environment", self.dbobj.host_environment, True) ## TODO : This is just to satisfy quattor schema ## needs to be removed as soon as the schema allows this pan_assign(lines, "/system/personality/systemgrn", []) if self.dbobj.config_override: pan_include(lines, "features/personality/config_override/config") ## include post features path = PlenaryPersonalityPostFeature.template_name(self.dbobj) pan_include_if_exists(lines, path)
def body(self, lines): pan_include(lines, ["pan/units", "pan/functions"]) pan_assign(lines, "/", StructureTemplate("clusterdata/%s" % self.name, {"metadata": PanValue("/metadata")})) pan_include(lines, "archetype/base") for servinst in sorted(self.dbobj.service_bindings): pan_include(lines, "service/%s/%s/client/config" % (servinst.service.name, servinst.name)) pan_include(lines, "personality/%s/config" % self.dbobj.personality.name) pan_include(lines, "archetype/final")
def body(self, lines): pan_variable(lines, "PERSONALITY", self.name) ## process grns eon_id_map = defaultdict(set) # own == pers level for grn_rec in self.dbobj._grns: eon_id_map[grn_rec.target].add(grn_rec.grn.eon_id) for (target, eon_id_set) in eon_id_map.iteritems(): eon_id_list = list(eon_id_set) eon_id_list.sort() for eon_id in eon_id_list: pan_append(lines, "/system/eon_id_maps/%s" % target, eon_id) archetype = self.dbobj.archetype.name # backward compat for esp reporting if self.config.has_option("archetype_" + archetype, "default_grn_target"): default_grn_target = self.config.get("archetype_" + archetype, "default_grn_target") eon_id_set = eon_id_map[default_grn_target] eon_id_list = list(eon_id_set) eon_id_list.sort() for eon_id in eon_id_list: pan_append(lines, "/system/eon_ids", eon_id) pan_assign(lines, "/system/personality/owner_eon_id", self.dbobj.owner_eon_id) ## include pre features pan_include_if_exists(lines, "%s/pre_feature" % self.plenary_core) ## process parameter templates pan_include_if_exists(lines, "personality/config") pan_assign(lines, "/system/personality/name", self.name) pan_assign(lines, "/system/personality/host_environment", self.dbobj.host_environment) ## TODO : This is just to satisfy quattor schema ## needs to be removed as soon as the schema allows this pan_assign(lines, "/system/personality/systemgrn", []) if self.dbobj.config_override: pan_include(lines, "features/personality/config_override/config") ## include post features pan_include_if_exists(lines, "%s/post_feature" % self.plenary_core)
def body(self, lines): pan_include(lines, ["pan/units", "pan/functions"]) pan_assign(lines, "/", StructureTemplate("clusterdata/%s" % self.dbobj.name, {"metadata": PanValue("/metadata")})) pan_include(lines, "archetype/base") #for esx_management_server for servinst in sorted(self.dbobj.service_bindings): path = PlenaryServiceInstanceClientDefault.template_name(servinst) pan_include(lines, path) path = PlenaryPersonalityBase.template_name(self.dbobj.personality) pan_include(lines, path) pan_include(lines, "archetype/final")
def body(self, lines): pan_include(lines, ["pan/units", "pan/functions"]) pan_assign( lines, "/", StructureTemplate("clusterdata/%s" % self.name, {"metadata": PanValue("/metadata")})) pan_include(lines, "archetype/base") for servinst in sorted(self.dbobj.service_bindings): pan_include( lines, "service/%s/%s/client/config" % (servinst.service.name, servinst.name)) pan_include(lines, "personality/%s/config" % self.dbobj.personality.name) pan_include(lines, "archetype/final")
def body(self, lines): pers = self.dbobj.personality arch = pers.archetype # FIXME: Enforce that one of the interfaces is marked boot? for dbinterface in self.dbobj.machine.interfaces: # Management interfaces are not configured at the host level if dbinterface.interface_type == "management": continue services = [] required_services = set(arch.services + pers.services) for si in self.dbobj.services_used: required_services.discard(si.service) services.append(si.cfg_path + "/client/config") if required_services: missing = ", ".join(sorted([srv.name for srv in required_services])) raise IncompleteError( "Host %s is missing the following required " "services, please run 'aq reconfigure': %s." % (self.name, missing) ) provides = [] for si in self.dbobj.services_provided: provides.append("%s/server/config" % si.cfg_path) # Ensure used/provided services have a stable order services.sort() provides.sort() # Okay, here's the real content pan_include(lines, ["pan/units", "pan/functions"]) lines.append("") pan_assign(lines, "/", StructureTemplate("hostdata/%s" % self.name, {"metadata": PanValue("/metadata")})) pan_include(lines, "archetype/base") pan_include(lines, self.dbobj.operating_system.cfg_path + "/config") pan_include(lines, services) pan_include(lines, provides) personality_template = "personality/%s/config" % self.dbobj.personality.name pan_include(lines, personality_template) if self.dbobj.cluster: clplenary = PlenaryClusterClient(self.dbobj.cluster) pan_include(lines, clplenary.plenary_template_name) elif pers.cluster_required: raise IncompleteError( "Host %s personality %s requires cluster " "membership, please run 'aq cluster'." % (self.name, pers.name) ) pan_include(lines, "archetype/final")
def body(self, lines): pan_assign( lines, "/system/provides/%s" % self.service, StructureTemplate('servicedata/%s/%s/srvconfig' % (self.service, self.name))) pan_include(lines, "service/%s/server/config" % self.service)
def body(self, lines): pers = self.dbobj.personality arch = pers.archetype # FIXME: Enforce that one of the interfaces is marked boot? for dbinterface in self.dbobj.hardware_entity.interfaces: # Management interfaces are not configured at the host level if dbinterface.interface_type == 'management': continue services = [] required_services = set(arch.services + pers.services) for si in self.dbobj.services_used: required_services.discard(si.service) services.append(PlenaryServiceInstanceClientDefault.template_name(si)) if required_services: missing = ", ".join(sorted([srv.name for srv in required_services])) raise IncompleteError("{0} is missing the following required " "services, please run 'aq reconfigure': " "{1!s}.".format(self.dbobj, missing)) provides = [] for srv in self.dbobj.services_provided: si = srv.service_instance provides.append(PlenaryServiceInstanceServerDefault.template_name(si)) # Ensure used/provided services have a stable order services.sort() provides.sort() # Okay, here's the real content pan_include(lines, ["pan/units", "pan/functions"]) lines.append("") path = PlenaryHostData.template_name(self.dbobj) pan_assign(lines, "/", StructureTemplate(path, {"metadata": PanValue("/metadata")})) pan_include(lines, "archetype/base") opsys = self.dbobj.operating_system pan_include(lines, "os/%s/%s/config" % (opsys.name, opsys.version)) pan_include(lines, services) pan_include(lines, provides) path = PlenaryPersonalityBase.template_name(pers) pan_include(lines, path) if self.dbobj.cluster: pan_include(lines, PlenaryClusterClient.template_name(self.dbobj.cluster)) elif pers.cluster_required: raise IncompleteError("{0} requires cluster membership, please " "run 'aq cluster'.".format(pers)) pan_include(lines, "archetype/final")
def body(self, lines): ram = [ StructureTemplate("hardware/ram/generic", {"size": PanMetric(self.dbobj.memory, "MB")}) ] cpus = [] for cpu_num in range(self.dbobj.cpu_quantity): cpu = StructureTemplate( "hardware/cpu/%s/%s" % (self.dbobj.cpu.vendor.name, self.dbobj.cpu.name)) cpus.append(cpu) disks = {} for disk in self.dbobj.disks: devname = disk.device_name params = { "capacity": PanMetric(disk.capacity, "GB"), "interface": disk.controller_type } if disk.bootable: params["boot"] = True if disk.disk_type == 'local': tpl = StructureTemplate( ("hardware/harddisk/generic/%s" % disk.controller_type), params) if disk.controller_type == 'cciss': devname = "cciss/" + devname elif disk.disk_type == 'virtual_disk': share = disk.share params["path"] = "%s/%s.vmdk" % (self.machine, disk.device_name) params["address"] = disk.address params["sharename"] = share.name params["server"] = share.server params["mountpoint"] = share.mount tpl = params disks[PanEscape(devname)] = tpl managers = {} interfaces = {} for interface in self.dbobj.interfaces: path = "hardware/nic/%s/%s" % (interface.model.vendor, interface.model) if interface.interface_type == 'public': ifinfo = {} if interface.mac: ifinfo["hwaddr"] = interface.mac if interface.port_group: ifinfo["port_group"] = interface.port_group if interface.bootable: ifinfo["boot"] = interface.bootable interfaces[interface.name] = StructureTemplate(path, ifinfo) elif interface.interface_type == 'management': has_addr = False for addr in interface.assignments: has_addr = True manager = {"hwaddr": interface.mac} if addr.fqdns: manager["fqdn"] = addr.fqdns[0] managers[addr.logical_name] = manager if not has_addr: managers[interface.name] = {"hwaddr": interface.mac} elif interface.interface_type == 'bonding': # Bonding interfaces need an entry under /hardware/cards/nic # only if the MAC address has been explicitely set if interface.mac: ifinfo = {"hwaddr": interface.mac} interfaces[interface.name] = StructureTemplate( path, ifinfo) # Firstly, location pan_assign(lines, "location", self.sysloc) pan_assign(lines, "sysloc/building", self.building) pan_assign(lines, "sysloc/city", self.city) pan_assign(lines, "sysloc/continent", self.continent) if self.rack: pan_assign(lines, "rack/name", self.rack) if self.rackrow: pan_assign(lines, "rack/row", self.rackrow) if self.rackcol: pan_assign(lines, "rack/column", self.rackcol) if self.room: pan_assign(lines, "rack/room", self.room) # And a chassis location? if self.dbobj.chassis_slot: slot = self.dbobj.chassis_slot[0] pan_assign(lines, "chassis", slot.chassis.fqdn) pan_assign(lines, "slot", slot.slot_number) #if self.hub: # pan_assign(lines, "sysloc/hub", self.hub) if self.campus: pan_assign(lines, "sysloc/campus", self.campus) if self.bunker: pan_assign(lines, "sysloc/bunker", self.bunker) if self.dns_search_domains: pan_assign(lines, "sysloc/dns_search_domains", self.dns_search_domains) # Now describe the hardware lines.append("") if self.dbobj.serial_no: pan_assign(lines, "serialnumber", self.dbobj.serial_no) pan_assign(lines, "nodename", self.machine) pan_include( lines, "hardware/machine/%s/%s" % (self.dbobj.model.vendor.name, self.dbobj.model.name)) lines.append("") pan_assign(lines, "ram", ram) pan_assign(lines, "cpu", cpus) if disks: pan_assign(lines, "harddisks", disks) if interfaces: pan_assign(lines, "cards/nic", interfaces) # /hardware/console/preferred must be set, so we can't assign to # "/console" directly for manager in sorted(managers.keys()): pan_assign(lines, "console/%s" % manager, managers[manager])
def body(self, lines): ram = [StructureTemplate("hardware/ram/generic", {"size": PanMetric(self.dbobj.memory, "MB")})] cpus = [] for cpu_num in range(self.dbobj.cpu_quantity): cpu = StructureTemplate("hardware/cpu/%s/%s" % (self.dbobj.cpu.vendor.name, self.dbobj.cpu.name)) cpus.append(cpu) disks = {} for disk in self.dbobj.disks: devname = disk.device_name params = {"capacity": PanMetric(disk.capacity, "GB"), "interface": disk.controller_type} if disk.bootable: params["boot"] = True if hasattr(disk, "snapshotable") and disk.snapshotable is not None: params["snapshot"] = disk.snapshotable if disk.disk_type == 'local': tpl = StructureTemplate("hardware/harddisk/generic/%s" % disk.controller_type, params) if disk.controller_type == 'cciss': devname = "cciss/" + devname elif disk.disk_type == 'virtual_disk': share = disk.share params["path"] = "%s/%s.vmdk" % (self.dbobj.label, disk.device_name) params["address"] = disk.address params["sharename"] = share.name params["server"] = share.server params["mountpoint"] = share.mount tpl = params elif disk.disk_type == 'virtual_localdisk': filesystem = disk.filesystem params["path"] = "%s/%s.vmdk" % (self.dbobj.label, disk.device_name) params["address"] = disk.address params["filesystemname"] = filesystem.name params["mountpoint"] = filesystem.mountpoint tpl = params disks[devname] = tpl managers = {} interfaces = {} for interface in self.dbobj.interfaces: path = "hardware/nic/%s/%s" % (interface.model.vendor, interface.model) if interface.interface_type == 'public': ifinfo = {} if interface.mac: ifinfo["hwaddr"] = interface.mac if interface.port_group: ifinfo["port_group"] = interface.port_group if interface.bootable: ifinfo["boot"] = interface.bootable interfaces[interface.name] = StructureTemplate(path, ifinfo) elif interface.interface_type == 'management': has_addr = False for addr in interface.assignments: has_addr = True manager = {"hwaddr": interface.mac} if addr.fqdns: manager["fqdn"] = addr.fqdns[0] managers[addr.logical_name] = manager if not has_addr: managers[interface.name] = {"hwaddr": interface.mac} elif interface.interface_type == 'bonding': # Bonding interfaces need an entry under /hardware/cards/nic # only if the MAC address has been explicitely set if interface.mac: ifinfo = {"hwaddr": interface.mac} interfaces[interface.name] = StructureTemplate(path, ifinfo) # Firstly, location add_location_info(lines, self.dbobj.location) pan_assign(lines, "location", self.dbobj.location.sysloc()) # And a chassis location? if self.dbobj.chassis_slot: slot = self.dbobj.chassis_slot[0] pan_assign(lines, "chassis", slot.chassis.fqdn) pan_assign(lines, "slot", slot.slot_number) dns_search_domains = [] parents = self.dbobj.location.parents[:] parents.append(self.dbobj.location) parents.reverse() for parent in parents: # Filter out duplicates extra_domains = [map.dns_domain.name for map in parent.dns_maps if map.dns_domain.name not in dns_search_domains] dns_search_domains.extend(extra_domains) if dns_search_domains: pan_assign(lines, "sysloc/dns_search_domains", dns_search_domains) # Now describe the hardware lines.append("") if self.dbobj.serial_no: pan_assign(lines, "serialnumber", self.dbobj.serial_no) pan_assign(lines, "nodename", self.dbobj.label) pan_include(lines, "hardware/machine/%s/%s" % (self.dbobj.model.vendor.name, self.dbobj.model.name)) lines.append("") pan_assign(lines, "ram", ram) pan_assign(lines, "cpu", cpus) for name in sorted(disks.keys()): pan_assign(lines, "harddisks/{%s}" % name, disks[name]) if interfaces: pan_assign(lines, "cards/nic", interfaces) # /hardware/console/preferred must be set, so we can't assign to # "/console" directly for manager in sorted(managers.keys()): pan_assign(lines, "console/%s" % manager, managers[manager]) if self.dbobj.uri: pan_assign(lines, "uri", self.dbobj.uri)
def body(self, lines): pers = self.dbobj.personality arch = pers.archetype # FIXME: Enforce that one of the interfaces is marked boot? for dbinterface in self.dbobj.machine.interfaces: # Management interfaces are not configured at the host level if dbinterface.interface_type == 'management': continue services = [] required_services = set(arch.services + pers.services) for si in self.dbobj.services_used: required_services.discard(si.service) services.append(si.cfg_path + '/client/config') if required_services: missing = ", ".join(sorted([srv.name for srv in required_services])) raise IncompleteError( "Host %s is missing the following required " "services, please run 'aq reconfigure': %s." % (self.name, missing)) provides = [] for si in self.dbobj.services_provided: provides.append('%s/server/config' % si.cfg_path) # Ensure used/provided services have a stable order services.sort() provides.sort() # Okay, here's the real content pan_include(lines, ["pan/units", "pan/functions"]) lines.append("") pan_assign( lines, "/", StructureTemplate("hostdata/%s" % self.name, {"metadata": PanValue("/metadata")})) pan_include(lines, "archetype/base") pan_include(lines, self.dbobj.operating_system.cfg_path + '/config') pan_include(lines, services) pan_include(lines, provides) personality_template = "personality/%s/config" % \ self.dbobj.personality.name pan_include(lines, personality_template) if self.dbobj.cluster: clplenary = PlenaryClusterClient(self.dbobj.cluster) pan_include(lines, clplenary.plenary_template_name) elif pers.cluster_required: raise IncompleteError("Host %s personality %s requires cluster " "membership, please run 'aq cluster'." % (self.name, pers.name)) pan_include(lines, "archetype/final")
def body(self, lines): ram = [StructureTemplate("hardware/ram/generic", {"size": PanMetric(self.dbobj.memory, "MB")})] cpus = [] for cpu_num in range(self.dbobj.cpu_quantity): cpu = StructureTemplate("hardware/cpu/%s/%s" % (self.dbobj.cpu.vendor.name, self.dbobj.cpu.name)) cpus.append(cpu) disks = {} for disk in self.dbobj.disks: devname = disk.device_name params = {"capacity": PanMetric(disk.capacity, "GB"), "interface": disk.controller_type} if disk.bootable: params["boot"] = True if disk.disk_type == 'local': tpl = StructureTemplate( ("hardware/harddisk/generic/%s" % disk.controller_type), params) if disk.controller_type == 'cciss': devname = "cciss/" + devname elif disk.disk_type == 'virtual_disk': share = disk.share params["path"] = "%s/%s.vmdk" % (self.machine, disk.device_name) params["address"] = disk.address params["sharename"] = share.name params["server"] = share.server params["mountpoint"] = share.mount tpl = params disks[PanEscape(devname)] = tpl managers = {} interfaces = {} for interface in self.dbobj.interfaces: path = "hardware/nic/%s/%s" % (interface.model.vendor, interface.model) if interface.interface_type == 'public': ifinfo = {} if interface.mac: ifinfo["hwaddr"] = interface.mac if interface.port_group: ifinfo["port_group"] = interface.port_group if interface.bootable: ifinfo["boot"] = interface.bootable interfaces[interface.name] = StructureTemplate(path, ifinfo) elif interface.interface_type == 'management': has_addr = False for addr in interface.assignments: has_addr = True manager = {"hwaddr": interface.mac} if addr.fqdns: manager["fqdn"] = addr.fqdns[0] managers[addr.logical_name] = manager if not has_addr: managers[interface.name] = {"hwaddr": interface.mac} elif interface.interface_type == 'bonding': # Bonding interfaces need an entry under /hardware/cards/nic # only if the MAC address has been explicitely set if interface.mac: ifinfo = {"hwaddr": interface.mac} interfaces[interface.name] = StructureTemplate(path, ifinfo) # Firstly, location pan_assign(lines, "location", self.sysloc) pan_assign(lines, "sysloc/building", self.building) pan_assign(lines, "sysloc/city", self.city) pan_assign(lines, "sysloc/continent", self.continent) if self.rack: pan_assign(lines, "rack/name", self.rack) if self.rackrow: pan_assign(lines, "rack/row", self.rackrow) if self.rackcol: pan_assign(lines, "rack/column", self.rackcol) if self.room: pan_assign(lines, "rack/room", self.room) # And a chassis location? if self.dbobj.chassis_slot: slot = self.dbobj.chassis_slot[0] pan_assign(lines, "chassis", slot.chassis.fqdn) pan_assign(lines, "slot", slot.slot_number) #if self.hub: # pan_assign(lines, "sysloc/hub", self.hub) if self.campus: pan_assign(lines, "sysloc/campus", self.campus) if self.bunker: pan_assign(lines, "sysloc/bunker", self.bunker) if self.dns_search_domains: pan_assign(lines, "sysloc/dns_search_domains", self.dns_search_domains) # Now describe the hardware lines.append("") if self.dbobj.serial_no: pan_assign(lines, "serialnumber", self.dbobj.serial_no) pan_assign(lines, "nodename", self.machine) pan_include(lines, "hardware/machine/%s/%s" % (self.dbobj.model.vendor.name, self.dbobj.model.name)) lines.append("") pan_assign(lines, "ram", ram) pan_assign(lines, "cpu", cpus) if disks: pan_assign(lines, "harddisks", disks) if interfaces: pan_assign(lines, "cards/nic", interfaces) # /hardware/console/preferred must be set, so we can't assign to # "/console" directly for manager in sorted(managers.keys()): pan_assign(lines, "console/%s" % manager, managers[manager])
def body(self, lines): pan_assign(lines, "/system/provides/%s" % self.service, StructureTemplate('servicedata/%s/%s/srvconfig' % (self.service, self.name))) pan_include(lines, "service/%s/server/config" % self.service)
def body(self, lines): pan_include(lines, ["pan/units", "pan/functions"]) path = PlenaryClusterData.template_name(self.dbobj) pan_assign(lines, "/", StructureTemplate(path, {"metadata": PanValue("/metadata")})) pan_include(lines, "archetype/base") for servinst in sorted(self.dbobj.service_bindings, key=attrgetter('service.name', 'name')): path = PlenaryServiceInstanceClientDefault.template_name(servinst) pan_include(lines, path) for srv in sorted(self.dbobj.services_provided, key=attrgetter("service_instance.service.name", "service_instance.name")): path = PlenaryServiceInstanceServerDefault.template_name(srv.service_instance) pan_include(lines, path) path = PlenaryPersonalityBase.template_name(self.dbobj.personality) pan_include(lines, path) pan_include(lines, "archetype/final")