Exemple #1
0
class CloudStackInventory(object):
    def __init__(self):

        parser = argparse.ArgumentParser()
        parser.add_argument('--host')
        parser.add_argument('--list', action='store_true')
        parser.add_argument('--project')

        options = parser.parse_args()
        try:
            self.cs = CloudStack(**read_config())
        except CloudStackException:
            print >> sys.stderr, "Error: Could not connect to CloudStack API"
            sys.exit(1)

        project_id = -1
        if options.project:
            project_id = self.get_project_id(options.project)

        if options.host:
            data = self.get_host(options.host, project_id)
            print json.dumps(data, indent=2)
        elif options.list:
            data = self.get_list(project_id)
            print json.dumps(data, indent=2)
        else:
            print >> sys.stderr, "usage: --list | --host <hostname> [--project <project>]"
            sys.exit(1)

    def get_project_id(self, project):
        projects = self.cs.listProjects(listall=True)
        if projects:
            for p in projects['project']:
                if p['name'] == project or p['id'] == project:
                    return p['id']
        print >> sys.stderr, "Error: Project %s not found." % project
        sys.exit(1)

    def add_group(self, data, group_name, router_name):
        if group_name not in data:
            data[group_name] = {'hosts': []}
        data[group_name]['hosts'].append(router_name)
        return data

    def get_host(self, name, project_id):
        routers = []

        routers_projects = self.cs.listRouters(projectid=project_id,
                                               listall=True)
        if routers_projects and 'router' in routers_projects:
            routers = routers + routers_projects['router']

        routers_accounts = self.cs.listRouters(listall=True)
        if routers_accounts and 'router' in routers_accounts:
            routers = routers + routers_accounts['router']

        data = {}
        for router in routers:
            router_name = router['name']
            if name == router_name:
                data['zone'] = router['zonename']
                if 'linklocalip' in router:
                    data['ansible_ssh_host'] = router['linklocalip']
                data['state'] = router['state']
                data['redundant_state'] = router['redundantstate']
                if 'account' in router:
                    data['account'] = router['account']
                if 'project' in router:
                    data['project'] = router['project']
                data['service_offering'] = router['serviceofferingname']
                data['role'] = router['role']
                data['nic'] = []
                for nic in router['nic']:
                    data['nic'].append({
                        'ip': nic['ipaddress'],
                        'mac': nic['macaddress'],
                        'netmask': nic['netmask'],
                    })
                    if nic['isdefault']:
                        data['default_ip'] = nic['ipaddress']
                break

        systemvms = self.cs.listSystemVms()
        for systemvm in systemvms.get('systemvm') or []:
            systemvm_name = systemvm['name']
            if name == systemvm_name:
                data['zone'] = systemvm['zonename']
                if 'privateip' in systemvm:
                    data['ansible_ssh_host'] = systemvm['privateip']
                data['state'] = systemvm['state']
                break

        return data

    def get_list(self, project_id):
        data = {
            'all': {
                'hosts': [],
            },
            '_meta': {
                'hostvars': {},
            },
        }

        routers = []

        routers_projects = self.cs.listRouters(projectid=project_id,
                                               listall=True)
        if routers_projects and 'router' in routers_projects:
            routers = routers + routers_projects['router']

        routers_accounts = self.cs.listRouters(listall=True)
        if routers_accounts and 'router' in routers_accounts:
            routers = routers + routers_accounts['router']

        for router in routers:
            if router['state'] != 'Running':
                continue
            router_name = router['name']
            data['all']['hosts'].append(router_name)
            # Make a group per domain
            data = self.add_group(data, router['domain'], router_name)

            data['_meta']['hostvars'][router_name] = {}
            data['_meta']['hostvars'][router_name]['group'] = router['domain']
            data['_meta']['hostvars'][router_name]['domain'] = router['domain']
            if 'networkdomain' in router:
                data['_meta']['hostvars'][router_name][
                    'networkdomain'] = router['networkdomain']

            data['_meta']['hostvars'][router_name]['zone'] = router['zonename']
            # Make a group per zone
            data = self.add_group(data, router['zonename'], router_name)

            if 'project' in router:
                data['_meta']['hostvars'][router_name]['project'] = router[
                    'project']

                # Make a group per project
                data = self.add_group(data, router['project'], router_name)

            if 'account' in router:
                data['_meta']['hostvars'][router_name]['account'] = router[
                    'account']

                # Make a group per account
                data = self.add_group(data, router['account'], router_name)

            data['_meta']['hostvars'][router_name][
                'ansible_ssh_host'] = router['linklocalip']
            data['_meta']['hostvars'][router_name]['state'] = router['state']
            if 'redundantstate' in router:
                data['_meta']['hostvars'][router_name][
                    'redundant_state'] = router['redundantstate']

                if router['redundantstate'] in ['MASTER', 'BACKUP']:
                    data = self.add_group(data, 'redundant_routers',
                                          router_name)

                if router['redundantstate'] in ['MASTER']:
                    data = self.add_group(data, 'redundant_master_routers',
                                          router_name)

                if router['redundantstate'] in ['BACKUP']:
                    data = self.add_group(data, 'redundant_backup_routers',
                                          router_name)

                if router['redundantstate'] in ['UNKNOWN']:
                    data = self.add_group(data, 'non_redundant_routers',
                                          router_name)

            data['_meta']['hostvars'][router_name][
                'service_offering'] = router['serviceofferingname']
            data['_meta']['hostvars'][router_name]['nic'] = []
            for nic in router['nic']:
                data['_meta']['hostvars'][router_name]['nic'].append({
                    'ip':
                    nic['ipaddress'],
                    'mac':
                    nic['macaddress'],
                    'netmask':
                    nic['netmask'],
                })
                if nic['isdefault']:
                    data['_meta']['hostvars'][router_name]['default_ip'] = nic[
                        'ipaddress']

        systemvms = self.cs.listSystemVms()

        for systemvm in systemvms.get('systemvm') or []:
            if systemvm['state'] != 'Running':
                continue

            if 'privateip' not in systemvm:
                continue

            systemvm_name = systemvm['name']

            data['all']['hosts'].append(systemvm_name)
            # Make a group per domain
            data = self.add_group(data, 'ROOT', systemvm_name)

            data['_meta']['hostvars'][systemvm_name] = dict(
                group='ROOT',
                domain='ROOT',
                account='system',
                zone=systemvm['zonename'])

            # Make a group per zone
            data = self.add_group(data, systemvm['zonename'], systemvm_name)

            data['_meta']['hostvars'][systemvm_name][
                'ansible_ssh_host'] = systemvm['privateip']
            data['_meta']['hostvars'][systemvm_name]['state'] = systemvm[
                'state']

        return data
class csresources:
    def __init__(self):
        tempdict = {}
        path = os.path.dirname(os.path.abspath(__file__))
        # Read config
        try:
            f = open(path + "/../cloudstack.config", "r")
            config = f.readlines()
        except:
            print("Somethings wrong with your config file")
            sys.exit(2)

        for entry in config:
            entry = entry.replace("\n", "")
            temarray = entry.split("=")
            tempdict[temarray[0]] = temarray[1]

        if tempdict['verify'] is None:
            tempdict['verify'] = False

        self.cs = CloudStack(endpoint=tempdict['endpoint'],
                             key=tempdict['key'],
                             secret=tempdict['secret'],
                             verify=False)

    def list_virtual_routers(self):
        routerList = []
        domains = self.cs.listDomains()
        for domain in domains['domain']:
            projects = self.cs.listProjects(domainid=domain["id"])
            if "project" in projects:
                for project in projects["project"]:
                    routers = self.cs.listRouters(projectid=project["id"])
                    if "router" in routers:
                        for router in routers["router"]:
                            routerList.append(router)
            routers = self.cs.listRouters(domainid=domain["id"])
            if "router" in routers:
                for router in routers["router"]:
                    routerList.append(router)
        return routerList

    def list_system_vms(self):
        return self.cs.listSystemVms()['systemvm']

    def list_capacity(self):
        return self.cs.listCapacity()['capacity']

    def list_projects(self, domainfilter=None, projectfilter=None):
        projects = []
        domains = self.cs.listDomains(id=domainfilter)['domain']
        if projectfilter is not None and domainfilter is not None:
            temp = self.cs.listProjects(domainid=domainfilter,
                                        id=projectfilter)
            if 'project' in temp:
                projects += temp['project']
        else:
            for domain in domains:
                temp = self.cs.listProjects(domainid=domain['id'])
                if 'project' in temp:
                    for project in temp['project']:
                        projects.append(project)
        return projects

    def list_domains(self, domainfilter=None):
        return self.cs.listDomains(id=domainfilter)['domain']

    def list_clusters(self):
        return self.cs.listClusters()['cluster']

    def list_offerings(self):
        return self.cs.listServiceOfferings()['serviceoffering']

    def list_hvs(self):
        return self.cs.listHosts(type="Routing")['host']

    def get_hvstructure(self, cluster, withvm=1):
        hvstatus = []
        domains = self.cs.listDomains()
        vmdict = []
        if 'cluster.memory.allocated.capacity.disablethreshold' in cluster[
                'resourcedetails']:
            memthreshold = cluster['resourcedetails'][
                'cluster.memory.allocated.capacity.disablethreshold']
        else:
            memthreshold = 1
        if 'cluster.cpu.allocated.capacity.disablethreshold' in cluster[
                'resourcedetails']:
            cputhreshold = cluster['resourcedetails'][
                'cluster.cpu.allocated.capacity.disablethreshold']
        else:
            cputhreshold = 1
        memovercommit = cluster['resourcedetails']['memoryOvercommitRatio']
        cpuovercommit = cluster['resourcedetails']['cpuOvercommitRatio']
        clusterid = cluster['id']

        hosts = self.cs.listHosts(clusterid=clusterid)

        #Get Host list
        for host in hosts['host']:
            if host['type'] == "Routing":
                hvstatus.append({
                    'name':
                    host['name'],
                    'cpu': (float(host['cpunumber'] * host['cpuspeed']) *
                            float(cpuovercommit)) * float(cputhreshold),
                    'mem': ((host['memorytotal'] * float(memovercommit)) *
                            float(memthreshold)) / 1024,
                    'memfree': ((host['memorytotal'] * float(memthreshold)) -
                                host['memoryused']) / 1024,
                    'cpufree': ((float(host['cpunumber'] * host['cpuspeed']) *
                                 float(cpuovercommit)) * float(cputhreshold)) -
                    (float(host['cpuallocated'].replace("%", "")) *
                     ((host['cpunumber'] * host['cpuspeed']) / 100)),
                    'ratio':
                    None,
                    'vms': [],
                })

        ##Split this as an extra function!!!!!!
        if withvm == 1:
            # Get VM list
            for domain in domains['domain']:
                projects = self.cs.listProjects(domainid=domain['id'])
                if "project" in projects.keys():
                    for project in projects['project']:
                        vms = self.cs.listVirtualMachines(
                            projectid=project['id'])
                        if "virtualmachine" in vms:
                            for vm in vms['virtualmachine']:
                                vmdict.append(vm)

            #Add VMs to their Hypervisors
            for vm in vmdict:
                for hv in hvstatus:
                    if "hostname" in vm:
                        if vm['hostname'] == hv['name']:
                            hv['vms'].append({
                                'name':
                                vm['name'],
                                'cpu':
                                vm['cpunumber'] * vm['cpuspeed'],
                                'mem':
                                vm['memory'] * 1024,
                                'instance':
                                vm['instancename'],
                            })
        return hvstatus