def render(self, session, network, ip, network_environment, all, style, type=False, hosts=False, **arguments): options = [undefer('comments'), joinedload('location')] if hosts or style == "proto": options.extend([subqueryload("assignments"), joinedload("assignments.interface"), joinedload("assignments.dns_records"), subqueryload("dynamic_stubs")]) dbnet_env = NetworkEnvironment.get_unique_or_default(session, network_environment) dbnetwork = network and get_network_byname(session, network, dbnet_env, query_options=options) or None dbnetwork = ip and get_network_byip(session, ip, dbnet_env, query_options=options) or dbnetwork q = session.query(Network) q = q.filter_by(network_environment=dbnet_env) q = q.options(*options) if dbnetwork: if hosts: return NetworkHostList([dbnetwork]) else: return dbnetwork if type: q = q.filter_by(network_type=type) dblocation = get_location(session, **arguments) if dblocation: childids = dblocation.offspring_ids() q = q.filter(Network.location_id.in_(childids)) q = q.order_by(Network.ip) q = q.options(*options) if hosts: return NetworkHostList(q.all()) else: return SimpleNetworkList(q.all())
def render(self, session, service, instance, archetype, personality, networkip, **kwargs): dbservice = Service.get_unique(session, service, compel=True) dblocation = get_location(session, **kwargs) dbinstance = get_service_instance(session, dbservice, instance) if networkip: dbnet_env = NetworkEnvironment.get_unique_or_default(session) dbnetwork = get_network_byip(session, networkip, dbnet_env) else: dbnetwork = None if archetype is None and personality: # Can't get here with the standard aq client. raise ArgumentError("Specifying --personality requires you to " "also specify --archetype.") kwargs = {} if archetype and personality: dbpersona = Personality.get_unique(session, name=personality, archetype=archetype, compel=True) map_class = PersonalityServiceMap query = session.query(map_class).filter_by(personality=dbpersona) kwargs["personality"] = dbpersona else: map_class = ServiceMap query = session.query(map_class) dbmap = query.filter_by(location=dblocation, service_instance=dbinstance, network=dbnetwork).first() if not dbmap: dbmap = map_class(service_instance=dbinstance, location=dblocation, network=dbnetwork, **kwargs) session.add(dbmap) session.flush() return
def render(self, session, service, instance, archetype, personality, networkip, **kwargs): dbservice = Service.get_unique(session, service, compel=True) dblocation = get_location(session, **kwargs) dbinstance = get_service_instance(session, dbservice, instance) if networkip: dbnet_env = NetworkEnvironment.get_unique_or_default(session) dbnetwork = get_network_byip(session, networkip, dbnet_env) else: dbnetwork = None if archetype is None and personality: # Can't get here with the standard aq client. raise ArgumentError("Specifying --personality requires you to " "also specify --archetype.") kwargs = {} if archetype and personality: dbpersona = Personality.get_unique(session, name=personality, archetype=archetype, compel=True) map_class = PersonalityServiceMap query = session.query(map_class).filter_by(personality=dbpersona) kwargs["personality"] = dbpersona else: map_class = ServiceMap query = session.query(map_class) dbmap = query.filter_by(location=dblocation, service_instance=dbinstance, network=dbnetwork).first() if not dbmap: dbmap = map_class(service_instance=dbinstance, location=dblocation, network=dbnetwork, **kwargs) session.add(dbmap) session.flush() return
def render(self, session, network, ip, network_environment, all, style, type=False, hosts=False, **arguments): options = [undefer('comments'), joinedload('location')] if hosts or style == "proto": options.extend([ subqueryload("assignments"), joinedload("assignments.interface"), joinedload("assignments.dns_records"), subqueryload("dynamic_stubs") ]) dbnet_env = NetworkEnvironment.get_unique_or_default( session, network_environment) dbnetwork = network and get_network_byname( session, network, dbnet_env, query_options=options) or None dbnetwork = ip and get_network_byip( session, ip, dbnet_env, query_options=options) or dbnetwork q = session.query(Network) q = q.filter_by(network_environment=dbnet_env) q = q.options(*options) if dbnetwork: if hosts: return NetworkHostList([dbnetwork]) else: return dbnetwork if type: q = q.filter_by(network_type=type) dblocation = get_location(session, **arguments) if dblocation: childids = dblocation.offspring_ids() q = q.filter(Network.location_id.in_(childids)) q = q.order_by(Network.ip) q = q.options(*options) if hosts: return NetworkHostList(q.all()) else: return SimpleNetworkList(q.all())
def search_system_query(session, dns_record_type=DnsRecord, **kwargs): q = session.query(dns_record_type) # Outer-join in all the subclasses so that each access of # system doesn't (necessarily) issue another query. if dns_record_type is DnsRecord: q = q.with_polymorphic('*') dbdns_env = DnsEnvironment.get_unique_or_default(session, kwargs.get("dns_environment", None)) q = q.join((Fqdn, DnsRecord.fqdn_id == Fqdn.id)) q = q.filter_by(dns_environment=dbdns_env) q = q.options(contains_eager('fqdn')) if kwargs.get('fqdn', None): (short, dbdns_domain) = parse_fqdn(session, kwargs['fqdn']) q = q.filter_by(name=short, dns_domain=dbdns_domain) if kwargs.get('dns_domain', None): dbdns_domain = DnsDomain.get_unique(session, kwargs['dns_domain'], compel=True) q = q.filter_by(dns_domain=dbdns_domain) if kwargs.get('shortname', None): q = q.filter_by(name=kwargs['shortname']) q = q.reset_joinpoint() if kwargs.get('ip', None): q = q.filter(ARecord.ip == kwargs['ip']) if kwargs.get('networkip', None): net_env = kwargs.get('network_environment', None) dbnet_env = NetworkEnvironment.get_unique_or_default(session, net_env) dbnetwork = get_network_byip(session, kwargs['networkip'], dbnet_env) q = q.filter(ARecord.network == dbnetwork) if kwargs.get('mac', None): raise UnimplementedError("search_system --mac is no longer supported, " "try search_hardware.") if kwargs.get('type', None): # Deprecated... remove if it becomes a problem. type_arg = kwargs['type'].strip().lower() q = q.filter_by(dns_record_type=type_arg) return q
def render(self, session, service, instance, archetype, personality, networkip, **arguments): dbservice = Service.get_unique(session, service, compel=True) dbinstance = ServiceInstance.get_unique(session, service=dbservice, name=instance, compel=True) dblocation = get_location(session, **arguments) if networkip: dbnet_env = NetworkEnvironment.get_unique_or_default(session) dbnetwork = get_network_byip(session, networkip, dbnet_env) else: dbnetwork = None if personality: if not archetype: # Can't get here with the standard aq client. raise ArgumentError("Specifying --personality requires you to " "also specify --archetype.") dbarchetype = Archetype.get_unique(session, archetype, compel=True) dbpersonality = Personality.get_unique(session, archetype=dbarchetype, name=personality, compel=True) q = session.query(PersonalityServiceMap) q = q.filter_by(personality=dbpersonality) else: q = session.query(ServiceMap) q = q.filter_by(location=dblocation, service_instance=dbinstance, network=dbnetwork) dbmap = q.first() if dbmap: session.delete(dbmap) session.flush() return
def render(self, session, service, instance, archetype, personality, networkip, **arguments): dbservice = Service.get_unique(session, service, compel=True) dbinstance = ServiceInstance.get_unique(session, service=dbservice, name=instance, compel=True) dblocation = get_location(session, **arguments) if networkip: dbnet_env = NetworkEnvironment.get_unique_or_default(session) dbnetwork = get_network_byip(session, networkip, dbnet_env) else: dbnetwork = None if personality: if not archetype: # Can't get here with the standard aq client. raise ArgumentError("Specifying --personality requires you to " "also specify --archetype.") dbarchetype = Archetype.get_unique(session, archetype, compel=True) dbpersonality = Personality.get_unique(session, archetype=dbarchetype, name=personality, compel=True) q = session.query(PersonalityServiceMap) q = q.filter_by(personality=dbpersonality) else: q = session.query(ServiceMap) q = q.filter_by(location=dblocation, service_instance=dbinstance, network=dbnetwork) dbmap = q.first() if dbmap: session.delete(dbmap) session.flush() return
def render(self, session, service, instance, archetype, personality, networkip, include_parents, **arguments): dbservice = service and Service.get_unique(session, service, compel=True) or None dblocation = get_location(session, **arguments) queries = [] # The current logic basically shoots for exact match when given # (like exact personality maps only or exact archetype maps # only), or "any" if an exact spec isn't given. if archetype and personality: dbpersona = Personality.get_unique(session, name=personality, archetype=archetype, compel=True) q = session.query(PersonalityServiceMap) q = q.filter_by(personality=dbpersona) queries.append(q) elif personality: # Alternately, this could throw an error and ask for archetype. q = session.query(PersonalityServiceMap) q = q.join('personality').filter_by(name=personality) q = q.reset_joinpoint() queries.append(q) elif archetype: # Alternately, this could throw an error and ask for personality. q = session.query(PersonalityServiceMap) q = q.join('personality', 'archetype').filter_by(name=archetype) q = q.reset_joinpoint() queries.append(q) else: queries.append(session.query(ServiceMap)) queries.append(session.query(PersonalityServiceMap)) if dbservice: for i in range(len(queries)): queries[i] = queries[i].join('service_instance') queries[i] = queries[i].filter_by(service=dbservice) queries[i] = queries[i].reset_joinpoint() if instance: for i in range(len(queries)): queries[i] = queries[i].join('service_instance') queries[i] = queries[i].filter_by(name=instance) queries[i] = queries[i].reset_joinpoint() # Nothing fancy for now - just show any relevant explicit bindings. if dblocation: for i in range(len(queries)): if include_parents: base_cls = queries[i].column_descriptions[0]["expr"] col = base_cls.location_id queries[i] = queries[i].filter(col.in_(dblocation.parent_ids())) else: queries[i] = queries[i].filter_by(location=dblocation) if networkip: dbnet_env = NetworkEnvironment.get_unique_or_default(session) dbnetwork = get_network_byip(session, networkip, dbnet_env) for i in range(len(queries)): queries[i] = queries[i].filter_by(network=dbnetwork) results = ServiceMapList() for q in queries: results.extend(q.all()) if service and instance and dblocation: # This should be an exact match. (Personality doesn't # matter... either it was given and it should be an # exact match for PersonalityServiceMap or it wasn't # and this should be an exact match for ServiceMap.) if not results: raise NotFoundException("No matching map found.") return results
def render(self, session, logger, hostname, machine, archetype, buildstatus, personality, osname, osversion, service, instance, model, machine_type, vendor, serial, cluster, guest_on_cluster, guest_on_share, member_cluster_share, domain, sandbox, branch, sandbox_owner, dns_domain, shortname, mac, ip, networkip, network_environment, exact_location, server_of_service, server_of_instance, grn, eon_id, fullinfo, **arguments): dbnet_env = NetworkEnvironment.get_unique_or_default( session, network_environment) q = session.query(Host) if machine: dbmachine = Machine.get_unique(session, machine, compel=True) q = q.filter_by(machine=dbmachine) # Add the machine definition and the primary name. Use aliases to make # sure the end result will be ordered by primary name. PriDns = aliased(DnsRecord) PriFqdn = aliased(Fqdn) PriDomain = aliased(DnsDomain) q = q.join(Machine, (PriDns, PriDns.id == Machine.primary_name_id), (PriFqdn, PriDns.fqdn_id == PriFqdn.id), (PriDomain, PriFqdn.dns_domain_id == PriDomain.id)) q = q.order_by(PriFqdn.name, PriDomain.name) q = q.options( contains_eager('machine'), contains_eager('machine.primary_name', alias=PriDns), contains_eager('machine.primary_name.fqdn', alias=PriFqdn), contains_eager('machine.primary_name.fqdn.dns_domain', alias=PriDomain)) q = q.reset_joinpoint() # Hardware-specific filters dblocation = get_location(session, **arguments) if dblocation: if exact_location: q = q.filter(Machine.location == dblocation) else: childids = dblocation.offspring_ids() q = q.filter(Machine.location_id.in_(childids)) if model or vendor or machine_type: subq = Model.get_matching_query(session, name=model, vendor=vendor, machine_type=machine_type, compel=True) q = q.filter(Machine.model_id.in_(subq)) if serial: self.deprecated_option( "serial", "Please use search machine --serial instead.", logger=logger, **arguments) q = q.filter(Machine.serial_no == serial) # DNS IP address related filters if mac or ip or networkip or hostname or dns_domain or shortname: # Inner joins are cheaper than outer joins, so make some effort to # use inner joins when possible if mac or ip or networkip: q = q.join(Interface) else: q = q.outerjoin(Interface) if ip or networkip: q = q.join(AddressAssignment, Network, from_joinpoint=True) else: q = q.outerjoin(AddressAssignment, Network, from_joinpoint=True) if mac: self.deprecated_option("mac", "Please use search machine " "--mac instead.", logger=logger, **arguments) q = q.filter(Interface.mac == mac) if ip: q = q.filter(AddressAssignment.ip == ip) q = q.filter(Network.network_environment == dbnet_env) if networkip: dbnetwork = get_network_byip(session, networkip, dbnet_env) q = q.filter(AddressAssignment.network == dbnetwork) dbdns_domain = None if hostname: (shortname, dbdns_domain) = parse_fqdn(session, hostname) if dns_domain: dbdns_domain = DnsDomain.get_unique(session, dns_domain, compel=True) if shortname or dbdns_domain: ARecAlias = aliased(ARecord) ARecFqdn = aliased(Fqdn) q = q.outerjoin( (ARecAlias, and_(ARecAlias.ip == AddressAssignment.ip, ARecAlias.network_id == AddressAssignment.network_id)), (ARecFqdn, ARecAlias.fqdn_id == ARecFqdn.id)) if shortname: q = q.filter( or_(ARecFqdn.name == shortname, PriFqdn.name == shortname)) if dbdns_domain: q = q.filter( or_(ARecFqdn.dns_domain == dbdns_domain, PriFqdn.dns_domain == dbdns_domain)) q = q.reset_joinpoint() (dbbranch, dbauthor) = get_branch_and_author(session, logger, domain=domain, sandbox=sandbox, branch=branch) if sandbox_owner: dbauthor = get_user_principal(session, sandbox_owner) if dbbranch: q = q.filter_by(branch=dbbranch) if dbauthor: q = q.filter_by(sandbox_author=dbauthor) if archetype: # Added to the searches as appropriate below. dbarchetype = Archetype.get_unique(session, archetype, compel=True) if personality and archetype: dbpersonality = Personality.get_unique(session, archetype=dbarchetype, name=personality, compel=True) q = q.filter_by(personality=dbpersonality) elif personality: PersAlias = aliased(Personality) q = q.join(PersAlias).filter_by(name=personality) q = q.reset_joinpoint() elif archetype: PersAlias = aliased(Personality) q = q.join(PersAlias).filter_by(archetype=dbarchetype) q = q.reset_joinpoint() if buildstatus: dbbuildstatus = HostLifecycle.get_unique(session, buildstatus, compel=True) q = q.filter_by(status=dbbuildstatus) if osname and osversion and archetype: # archetype was already resolved above dbos = OperatingSystem.get_unique(session, name=osname, version=osversion, archetype=dbarchetype, compel=True) q = q.filter_by(operating_system=dbos) elif osname or osversion: q = q.join('operating_system') if osname: q = q.filter_by(name=osname) if osversion: q = q.filter_by(version=osversion) q = q.reset_joinpoint() if service: dbservice = Service.get_unique(session, service, compel=True) if instance: dbsi = get_service_instance(session, dbservice, instance) q = q.filter(Host.services_used.contains(dbsi)) else: q = q.join('services_used') q = q.filter_by(service=dbservice) q = q.reset_joinpoint() elif instance: q = q.join('services_used') q = q.filter_by(name=instance) q = q.reset_joinpoint() if server_of_service: dbserver_service = Service.get_unique(session, server_of_service, compel=True) if server_of_instance: dbssi = get_service_instance(session, dbserver_service, server_of_instance) q = q.join('_services_provided') q = q.filter_by(service_instance=dbssi) q = q.reset_joinpoint() else: q = q.join('_services_provided', 'service_instance') q = q.filter_by(service=dbserver_service) q = q.reset_joinpoint() elif server_of_instance: q = q.join('_services_provided', 'service_instance') q = q.filter_by(name=server_of_instance) q = q.reset_joinpoint() if cluster: dbcluster = Cluster.get_unique(session, cluster, compel=True) if isinstance(dbcluster, MetaCluster): q = q.join('_cluster', 'cluster', '_metacluster') q = q.filter_by(metacluster=dbcluster) else: q = q.filter_by(cluster=dbcluster) q = q.reset_joinpoint() if guest_on_cluster: # TODO: this does not handle metaclusters according to Wes dbcluster = Cluster.get_unique(session, guest_on_cluster, compel=True) q = q.join('machine', VirtualMachine, ClusterResource) q = q.filter_by(cluster=dbcluster) q = q.reset_joinpoint() if guest_on_share: #v2 v2shares = session.query( Share.id).filter_by(name=guest_on_share).all() if not v2shares: raise NotFoundException( "No shares found with name {0}.".format(guest_on_share)) NasAlias = aliased(VirtualDisk) q = q.join('machine', 'disks', (NasAlias, NasAlias.id == Disk.id)) q = q.filter(NasAlias.share_id.in_(map(lambda s: s[0], v2shares))) q = q.reset_joinpoint() if member_cluster_share: #v2 v2shares = session.query( Share.id).filter_by(name=member_cluster_share).all() if not v2shares: raise NotFoundException( "No shares found with name {0}.".format(guest_on_share)) NasAlias = aliased(VirtualDisk) q = q.join('_cluster', 'cluster', 'resholder', VirtualMachine, 'machine', 'disks', (NasAlias, NasAlias.id == Disk.id)) q = q.filter(NasAlias.share_id.in_(map(lambda s: s[0], v2shares))) q = q.reset_joinpoint() if grn or eon_id: dbgrn = lookup_grn(session, grn, eon_id, autoupdate=False) persq = session.query(Personality.id) persq = persq.outerjoin(PersonalityGrnMap) persq = persq.filter( or_(Personality.owner_eon_id == dbgrn.eon_id, PersonalityGrnMap.eon_id == dbgrn.eon_id)) q = q.outerjoin(HostGrnMap) q = q.filter( or_(Host.owner_eon_id == dbgrn.eon_id, HostGrnMap.eon_id == dbgrn.eon_id, Host.personality_id.in_(persq.subquery()))) q = q.reset_joinpoint() if fullinfo: return q.all() return SimpleHostList(q.all())
def render(self, session, logger, hostname, machine, archetype, buildstatus, personality, osname, osversion, service, instance, model, machine_type, vendor, serial, cluster, guest_on_cluster, guest_on_share, member_cluster_share, domain, sandbox, branch, sandbox_owner, dns_domain, shortname, mac, ip, networkip, network_environment, exact_location, server_of_service, server_of_instance, grn, eon_id, fullinfo, **arguments): dbnet_env = NetworkEnvironment.get_unique_or_default(session, network_environment) q = session.query(Host) if machine: dbmachine = Machine.get_unique(session, machine, compel=True) q = q.filter_by(machine=dbmachine) # Add the machine definition and the primary name. Use aliases to make # sure the end result will be ordered by primary name. PriDns = aliased(DnsRecord) PriFqdn = aliased(Fqdn) PriDomain = aliased(DnsDomain) q = q.join(Machine, (PriDns, PriDns.id == Machine.primary_name_id), (PriFqdn, PriDns.fqdn_id == PriFqdn.id), (PriDomain, PriFqdn.dns_domain_id == PriDomain.id)) q = q.order_by(PriFqdn.name, PriDomain.name) q = q.options(contains_eager('machine'), contains_eager('machine.primary_name', alias=PriDns), contains_eager('machine.primary_name.fqdn', alias=PriFqdn), contains_eager('machine.primary_name.fqdn.dns_domain', alias=PriDomain)) q = q.reset_joinpoint() # Hardware-specific filters dblocation = get_location(session, **arguments) if dblocation: if exact_location: q = q.filter(Machine.location == dblocation) else: childids = dblocation.offspring_ids() q = q.filter(Machine.location_id.in_(childids)) if model or vendor or machine_type: subq = Model.get_matching_query(session, name=model, vendor=vendor, machine_type=machine_type, compel=True) q = q.filter(Machine.model_id.in_(subq)) if serial: self.deprecated_option("serial", "Please use search machine --serial instead.", logger=logger, **arguments) q = q.filter(Machine.serial_no == serial) # DNS IP address related filters if mac or ip or networkip or hostname or dns_domain or shortname: # Inner joins are cheaper than outer joins, so make some effort to # use inner joins when possible if mac or ip or networkip: q = q.join(Interface) else: q = q.outerjoin(Interface) if ip or networkip: q = q.join(AddressAssignment, Network, from_joinpoint=True) else: q = q.outerjoin(AddressAssignment, Network, from_joinpoint=True) if mac: self.deprecated_option("mac", "Please use search machine " "--mac instead.", logger=logger, **arguments) q = q.filter(Interface.mac == mac) if ip: q = q.filter(AddressAssignment.ip == ip) q = q.filter(Network.network_environment == dbnet_env) if networkip: dbnetwork = get_network_byip(session, networkip, dbnet_env) q = q.filter(AddressAssignment.network == dbnetwork) dbdns_domain = None if hostname: (shortname, dbdns_domain) = parse_fqdn(session, hostname) if dns_domain: dbdns_domain = DnsDomain.get_unique(session, dns_domain, compel=True) if shortname or dbdns_domain: ARecAlias = aliased(ARecord) ARecFqdn = aliased(Fqdn) q = q.outerjoin((ARecAlias, and_(ARecAlias.ip == AddressAssignment.ip, ARecAlias.network_id == AddressAssignment.network_id)), (ARecFqdn, ARecAlias.fqdn_id == ARecFqdn.id)) if shortname: q = q.filter(or_(ARecFqdn.name == shortname, PriFqdn.name == shortname)) if dbdns_domain: q = q.filter(or_(ARecFqdn.dns_domain == dbdns_domain, PriFqdn.dns_domain == dbdns_domain)) q = q.reset_joinpoint() (dbbranch, dbauthor) = get_branch_and_author(session, logger, domain=domain, sandbox=sandbox, branch=branch) if sandbox_owner: dbauthor = get_user_principal(session, sandbox_owner) if dbbranch: q = q.filter_by(branch=dbbranch) if dbauthor: q = q.filter_by(sandbox_author=dbauthor) if archetype: # Added to the searches as appropriate below. dbarchetype = Archetype.get_unique(session, archetype, compel=True) if personality and archetype: dbpersonality = Personality.get_unique(session, archetype=dbarchetype, name=personality, compel=True) q = q.filter_by(personality=dbpersonality) elif personality: PersAlias = aliased(Personality) q = q.join(PersAlias).filter_by(name=personality) q = q.reset_joinpoint() elif archetype: PersAlias = aliased(Personality) q = q.join(PersAlias).filter_by(archetype=dbarchetype) q = q.reset_joinpoint() if buildstatus: dbbuildstatus = HostLifecycle.get_unique(session, buildstatus, compel=True) q = q.filter_by(status=dbbuildstatus) if osname and osversion and archetype: # archetype was already resolved above dbos = OperatingSystem.get_unique(session, name=osname, version=osversion, archetype=dbarchetype, compel=True) q = q.filter_by(operating_system=dbos) elif osname or osversion: q = q.join('operating_system') if osname: q = q.filter_by(name=osname) if osversion: q = q.filter_by(version=osversion) q = q.reset_joinpoint() if service: dbservice = Service.get_unique(session, service, compel=True) if instance: dbsi = get_service_instance(session, dbservice, instance) q = q.filter(Host.services_used.contains(dbsi)) else: q = q.join('services_used') q = q.filter_by(service=dbservice) q = q.reset_joinpoint() elif instance: q = q.join('services_used') q = q.filter_by(name=instance) q = q.reset_joinpoint() if server_of_service: dbserver_service = Service.get_unique(session, server_of_service, compel=True) if server_of_instance: dbssi = get_service_instance(session, dbserver_service, server_of_instance) q = q.join('_services_provided') q = q.filter_by(service_instance=dbssi) q = q.reset_joinpoint() else: q = q.join('_services_provided', 'service_instance') q = q.filter_by(service=dbserver_service) q = q.reset_joinpoint() elif server_of_instance: q = q.join('_services_provided', 'service_instance') q = q.filter_by(name=server_of_instance) q = q.reset_joinpoint() if cluster: dbcluster = Cluster.get_unique(session, cluster, compel=True) if isinstance(dbcluster, MetaCluster): q = q.join('_cluster', 'cluster', '_metacluster') q = q.filter_by(metacluster=dbcluster) else: q = q.filter_by(cluster=dbcluster) q = q.reset_joinpoint() if guest_on_cluster: # TODO: this does not handle metaclusters according to Wes dbcluster = Cluster.get_unique(session, guest_on_cluster, compel=True) q = q.join('machine', VirtualMachine, ClusterResource) q = q.filter_by(cluster=dbcluster) q = q.reset_joinpoint() if guest_on_share: #v2 v2shares = session.query(Share.id).filter_by(name=guest_on_share).all() if not v2shares: raise NotFoundException("No shares found with name {0}." .format(guest_on_share)) NasAlias = aliased(VirtualDisk) q = q.join('machine', 'disks', (NasAlias, NasAlias.id == Disk.id)) q = q.filter( NasAlias.share_id.in_(map(lambda s: s[0], v2shares))) q = q.reset_joinpoint() if member_cluster_share: #v2 v2shares = session.query(Share.id).filter_by(name=member_cluster_share).all() if not v2shares: raise NotFoundException("No shares found with name {0}." .format(guest_on_share)) NasAlias = aliased(VirtualDisk) q = q.join('_cluster', 'cluster', 'resholder', VirtualMachine, 'machine', 'disks', (NasAlias, NasAlias.id == Disk.id)) q = q.filter( NasAlias.share_id.in_(map(lambda s: s[0], v2shares))) q = q.reset_joinpoint() if grn or eon_id: dbgrn = lookup_grn(session, grn, eon_id, autoupdate=False) persq = session.query(Personality.id) persq = persq.outerjoin(PersonalityGrnMap) persq = persq.filter(or_(Personality.owner_eon_id == dbgrn.eon_id, PersonalityGrnMap.eon_id == dbgrn.eon_id)) q = q.outerjoin(HostGrnMap) q = q.filter(or_(Host.owner_eon_id == dbgrn.eon_id, HostGrnMap.eon_id == dbgrn.eon_id, Host.personality_id.in_(persq.subquery()))) q = q.reset_joinpoint() if fullinfo: return q.all() return SimpleHostList(q.all())
def render(self, session, service, instance, archetype, personality, networkip, include_parents, **arguments): dbservice = service and Service.get_unique( session, service, compel=True) or None dblocation = get_location(session, **arguments) queries = [] # The current logic basically shoots for exact match when given # (like exact personality maps only or exact archetype maps # only), or "any" if an exact spec isn't given. if archetype and personality: dbpersona = Personality.get_unique(session, name=personality, archetype=archetype, compel=True) q = session.query(PersonalityServiceMap) q = q.filter_by(personality=dbpersona) queries.append(q) elif personality: # Alternately, this could throw an error and ask for archetype. q = session.query(PersonalityServiceMap) q = q.join('personality').filter_by(name=personality) q = q.reset_joinpoint() queries.append(q) elif archetype: # Alternately, this could throw an error and ask for personality. q = session.query(PersonalityServiceMap) q = q.join('personality', 'archetype').filter_by(name=archetype) q = q.reset_joinpoint() queries.append(q) else: queries.append(session.query(ServiceMap)) queries.append(session.query(PersonalityServiceMap)) if dbservice: for i in range(len(queries)): queries[i] = queries[i].join('service_instance') queries[i] = queries[i].filter_by(service=dbservice) queries[i] = queries[i].reset_joinpoint() if instance: for i in range(len(queries)): queries[i] = queries[i].join('service_instance') queries[i] = queries[i].filter_by(name=instance) queries[i] = queries[i].reset_joinpoint() # Nothing fancy for now - just show any relevant explicit bindings. if dblocation: for i in range(len(queries)): if include_parents: base_cls = queries[i].column_descriptions[0]["expr"] col = base_cls.location_id queries[i] = queries[i].filter( col.in_(dblocation.parent_ids())) else: queries[i] = queries[i].filter_by(location=dblocation) if networkip: dbnet_env = NetworkEnvironment.get_unique_or_default(session) dbnetwork = get_network_byip(session, networkip, dbnet_env) for i in range(len(queries)): queries[i] = queries[i].filter_by(network=dbnetwork) results = ServiceMapList() for q in queries: results.extend(q.all()) if service and instance and dblocation: # This should be an exact match. (Personality doesn't # matter... either it was given and it should be an # exact match for PersonalityServiceMap or it wasn't # and this should be an exact match for ServiceMap.) if not results: raise NotFoundException("No matching map found.") return results
def render(self, session, logger, gateway, networkip, ip, netmask, prefixlen, network_environment, comments, personality, archetype, **arguments): dbnet_env = NetworkEnvironment.get_unique_or_default(session, network_environment) if gateway and networkip: raise ArgumentError("Exactly one of --gateway and --networkip " "should be specified.") elif gateway: dbnetwork = get_net_id_from_ip(session, gateway, dbnet_env) elif networkip: dbnetwork = get_network_byip(session, networkip, dbnet_env) if dbnetwork.routers: if len(dbnetwork.routers) > 1: raise ArgumentError("More than one router exists. " "Please specify one with --gateway") else: gateway = dbnetwork.routers[0].ip logger.client_info("Gateway %s taken from router address " "of network %s." % (gateway, dbnetwork.network)) else: # No routers are defined, so take an educated guess gateway = dbnetwork.network[dbnetwork.default_gateway_offset] logger.client_info("Gateway %s taken from default offset %d " "for network %s." % (gateway, dbnetwork.default_gateway_offset, dbnetwork.network)) else: raise ArgumentError("Please either --gateway or --networkip") if netmask: dest = IPv4Network("%s/%s" % (ip, netmask)) else: dest = IPv4Network("%s/%s" % (ip, prefixlen)) if dest.network != ip: raise ArgumentError("%s is not a network address; " "did you mean %s." % (ip, dest.network)) if personality: dbpersonality = Personality.get_unique(session, name=personality, archetype=archetype, compel=True) else: dbpersonality = None # TODO: this will have to be changed if we want equal cost multipath # etc. for route in dbnetwork.static_routes: if dest.overlaps(route.destination): if route.personality and route.personality != dbpersonality: continue raise ArgumentError("{0} already has an overlapping route to " "{1} using gateway {2}." .format(dbnetwork, route.destination, route.gateway_ip)) route = StaticRoute(network=dbnetwork, dest_ip=dest.ip, dest_cidr=dest.prefixlen, gateway_ip=gateway, personality=dbpersonality, comments=comments) session.add(route) session.flush() # TODO: refresh affected host templates return