Пример #1
0
    def createUserNetwork(self):
        # UserDataを作成
        userData = {}
        zabbixserver = getOtherProperty("zabbix.server")
        if (isNotEmpty(zabbixserver)):
            #Zabbixサーバー(ルーティング用)
            userData.update({"zabbixserver": zabbixserver})

        routeAddserver = getOtherProperty("vCloud.routeAddserver")
        if (isNotEmpty(routeAddserver)):
            #ユーザー指定ルーティングサーバ
            userData.update({"routeAddserver": routeAddserver})

        return userData
    def createUserNetwork(self):
        # UserDataを作成
        userData = {}
        zabbixserver = getOtherProperty("zabbix.server")
        if isNotEmpty(zabbixserver):
            # Zabbixサーバー(ルーティング用)
            userData.update({"zabbixserver": zabbixserver})

        routeAddserver = getOtherProperty("vCloud.routeAddserver")
        if isNotEmpty(routeAddserver):
            # ユーザー指定ルーティングサーバ
            userData.update({"routeAddserver": routeAddserver})

        return userData
    def _makePccVAppNetwork(self, network_xml, name, href=None):
            name = name
            href = href
            fencemode = None
            gateway = None
            netmask = None
            dns1 = None
            dns2 = None
            iprangeF =None
            iprangeT =None
            primary = False


            if name == getOtherProperty("vCloud.PCCNetwork"):
                primary = True

            if href is None:
                link = network_xml.find(fixxpath(network_xml, 'Link'))
                if link is not None:
                    href = link.get('href')

            fence = network_xml.find(fixxpath(network_xml, 'Configuration/FenceMode'))
            if fence is not None:
                fencemode = fence.text

            scope =  network_xml.find(fixxpath(network_xml, 'Configuration/IpScopes/IpScope'))
            for elem in scope:
                if elem.tag == '{http://www.vmware.com/vcloud/v1.5}Gateway':
                    gateway = elem.text
                if elem.tag == '{http://www.vmware.com/vcloud/v1.5}Netmask':
                    netmask = elem.text
                if elem.tag == '{http://www.vmware.com/vcloud/v1.5}Dns1':
                    dns1 = elem.text
                if elem.tag == '{http://www.vmware.com/vcloud/v1.5}Dns2':
                    dns2 = elem.text

            ipranges =  network_xml.findall(fixxpath(network_xml, 'Configuration/IpScopes/IpScope/IpRanges/IpRange'))
            if ipranges is not None:
                for iprange in ipranges:
                    for elem in iprange:
                        if elem.tag == '{http://www.vmware.com/vcloud/v1.5}StartAddress':
                            iprangeF = elem.text
                        if elem.tag == '{http://www.vmware.com/vcloud/v1.5}EndAddress':
                            iprangeT = elem.text
                    #複数範囲は現状想定しない
                    break

            return PccVAppNetwork(name, href, fencemode, gateway, netmask, dns1, dns2, iprangeF, iprangeT, primary)
Пример #4
0
    def start(self, vdc, vApp, vm, vcInstance, pccInstance):
        #プラットフォーム
        platformTable = self.conn.getTable("PLATFORM")
        platform = self.conn.selectOne(
            platformTable.select(
                platformTable.c.PLATFORM_NO == pccInstance["PLATFORM_NO"]))

        tableIN = self.conn.getTable("VCLOUD_INSTANCE_NETWORK")
        instanceNw = self.conn.select(
            tableIN.select(tableIN.c.INSTANCE_NO == vcInstance["INSTANCE_NO"]))

        tableStorage = self.conn.getTable("PLATFORM_VCLOUD_STORAGE_TYPE")
        storage = self.conn.selectOne(
            tableStorage.select(tableStorage.c.STORAGE_TYPE_NO ==
                                vcInstance["STORAGE_TYPE_NO"]))

        # イベントログ出力
        self.conn.debug(
            pccInstance["FARM_NO"], None, None, pccInstance["INSTANCE_NO"],
            pccInstance["INSTANCE_NAME"], "VCloudInstanceStart",
            [platform["PLATFORM_NAME"], pccInstance["INSTANCE_NAME"]])

        #インスタンスタイプの取得
        tableType = self.conn.getTable("PLATFORM_VCLOUD_INSTANCE_TYPE")
        instype = self.conn.selectOne(
            tableType.select(
                and_(
                    tableType.c.INSTANCE_TYPE_NAME ==
                    vcInstance["INSTANCE_TYPE"],
                    tableType.c.PLATFORM_NO == pccInstance["PLATFORM_NO"])))
        #現状を取得
        setCpu = self.client.describeCPU(vm)
        setMemory = self.client.describeMemory(vm)

        #変更が有れば通知
        if str(instype["CPU"]) != str(setCpu):
            self.client._change_vm_cpu(vm["id"], instype["CPU"])
        if str(instype["MEMORY"]) != str(setMemory):
            self.client._change_vm_memory(vm["id"], instype["MEMORY"])

        #ストレージ変更
        if storage["STORAGE_TYPE_NAME"] != vm["storageprofile"]:
            #変更後のストレージプロファイル
            storageProfile = self.client.describeStorageProfile(
                vdc, storage["STORAGE_TYPE_NAME"])
            self.client.editInstance(vm, **{"storageProfile": storageProfile})

        #VAPPネットワークのアップデート確認
        self.client.checkNetwork(vApp, instanceNw)
        #IPアドレスの再設定
        self.client._change_vm_nw(vm["id"], instanceNw)

        #UserDataを作成
        userData = self.createUserData(pccInstance["INSTANCE_NO"], pccInstance,
                                       vcInstance)
        #PCCネットワークGWを設定
        vappnw = self.client.describeVappNetwork(vApp)
        for net in vappnw:
            if net.name == getOtherProperty("vCloud.PCCNetwork"):
                userData.update({"pccgateway": net.gateway})
                #ルーティングIP
                userData.update(self.createUserNetwork())

        #UserDataを整形
        userData = self.makeUserData(userData)

        #UserDataのキー とりあえず固定(VMWareと同一の物)
        key = "guestinfo.userdata"

        metadata = VCloudMetadataSet(key=key, value=userData)
        metadatas = [
            metadata,
        ]
        #ユーザーデータ登録
        self.client.setProductSections(vm, metadatas)

        # VCLOUD上のステータスを確認インスタンスが停止中
        startvm = None
        if (vm["state"] == VCloudIaasClient.STOPPED):
            # インスタンスの起動
            node = self.client.startInstance(vApp, vm)
            startvm = self.client.describeInstance(node, vcInstance["VM_NAME"])
        else:
            #既にスタートしている
            startvm = vm

        #イベントログ出力
        self.conn.debug(
            pccInstance["FARM_NO"], None, None, pccInstance["INSTANCE_NO"],
            pccInstance["INSTANCE_NAME"], "VCloudInstanceStartFinish",
            [platform["PLATFORM_NAME"], pccInstance["INSTANCE_NAME"]])

        # データベース更新
        table = self.conn.getTable("VCLOUD_INSTANCE")
        updateDict = self.conn.selectOne(
            table.select(table.c.INSTANCE_NO == pccInstance["INSTANCE_NO"]))
        updateDict["STATUS"] = startvm["state"]
        publicIp = startvm["public_ips"]
        privateIp = startvm["private_ips"]
        if len(publicIp) > 0:
            updateDict["IP_ADDRESS"] = publicIp[0]
        if len(privateIp) > 0:
            updateDict["PRIVATE_IP_ADDRESS"] = privateIp[0]
        else:
            updateDict["PRIVATE_IP_ADDRESS"] = updateDict["IP_ADDRESS"]
        sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"],
                           values=updateDict)
        self.conn.execute(sql)

        # TODO ここでネットーワークインデックス等を更新
        self.reflectVMNetwork(vm, pccInstance["INSTANCE_NO"])
Пример #5
0
    def cloneVM(self, vdc, vApp, image, vcInstance, pccInstance):

        #イベントログ出力
        platformTable = self.conn.getTable("PLATFORM")
        platform = self.conn.selectOne(
            platformTable.select(
                platformTable.c.PLATFORM_NO == pccInstance["PLATFORM_NO"]))
        self.conn.debug(
            pccInstance["FARM_NO"], None, None, pccInstance["INSTANCE_NO"],
            pccInstance["INSTANCE_NAME"], "VCloudInstanceCreate",
            [platform["PLATFORM_NAME"], pccInstance["INSTANCE_NAME"]])

        tableIN = self.conn.getTable("VCLOUD_INSTANCE_NETWORK")
        instanceNW = self.conn.select(
            tableIN.select(tableIN.c.INSTANCE_NO == vcInstance["INSTANCE_NO"]))

        tableStorage = self.conn.getTable("PLATFORM_VCLOUD_STORAGE_TYPE")
        storage = self.conn.selectOne(
            tableStorage.select(tableStorage.c.STORAGE_TYPE_NO ==
                                vcInstance["STORAGE_TYPE_NO"]))

        #イメージリンク
        imageHarf = self.client.describeImageHref(image["templateName"])

        #VAPPネットワークのアップデート確認
        self.client.checkNetwork(vApp, instanceNW)
        #ネットワーク設定 INDEX「0」にはPCCネットワークが入る為ダミーを設定
        useNetworks = [
            PccVMNetwork("", "", "", 0, 0),
        ]
        for net in instanceNW:
            #PCCネットワーク
            if getOtherProperty("vCloud.PCCNetwork") == net["NETWORK_NAME"]:
                useNetworks[0] = PccVMNetwork(net["NETWORK_NAME"],
                                              net["IP_ADDRESS"],
                                              net["IP_MODE"], 0,
                                              net["IS_PRIMARY"])
            else:
                useNetworks.append(
                    PccVMNetwork(net["NETWORK_NAME"], net["IP_ADDRESS"],
                                 net["IP_MODE"], net["NETWORK_INDEX"],
                                 net["IS_PRIMARY"]))

        #ストレージ
        storageProfile = self.client.describeStorageProfile(
            vdc, storage["STORAGE_TYPE_NAME"])

        #パラメータ作成
        info = {
            "image": imageHarf,
            "vm_name": pccInstance["INSTANCE_NAME"],
            "vm_storage": storageProfile,
            "vm_networks": useNetworks,
            "fqdn": pccInstance["FQDN"]
        }

        #仮想マシンを作成
        node = self.client.createInstances(vApp, **info)
        vm = self.client.describeInstance(node, pccInstance["INSTANCE_NAME"])
        self.logger.info(vm)
        #イベントログ出力
        self.conn.debug(
            pccInstance["FARM_NO"], None, None, pccInstance["INSTANCE_NO"],
            pccInstance["INSTANCE_NAME"], "VCloudInstanceCreateFinish",
            [platform["PLATFORM_NAME"], pccInstance["INSTANCE_NAME"]])

        #データベース更新
        tableVCINS = self.conn.getTable("VCLOUD_INSTANCE")
        updateDict = self.conn.selectOne(
            tableVCINS.select(
                tableVCINS.c.INSTANCE_NO == pccInstance["INSTANCE_NO"]))
        updateDict["VM_NAME"] = vm["name"]
        updateDict["STATUS"] = vm["state"]
        publicIp = vm["public_ips"]
        privateIp = vm["private_ips"]
        if len(publicIp) > 0:
            updateDict["IP_ADDRESS"] = publicIp[0]
        if len(privateIp) > 0:
            updateDict["PRIVATE_IP_ADDRESS"] = privateIp[0]
        else:
            updateDict["PRIVATE_IP_ADDRESS"] = updateDict["IP_ADDRESS"]

        sql = tableVCINS.update(
            tableVCINS.c.INSTANCE_NO == updateDict["INSTANCE_NO"],
            values=updateDict)
        self.conn.execute(sql)

        # TODO ここでネットーワークインデックスを更新
        self.reflectVMNetwork(vm, pccInstance["INSTANCE_NO"])

        return vm
    def _to_node(self, node_elm):

        publicNetworkName = getOtherProperty("vCloud.PCCNetwork")

        # Parse VMs as extra field
        vms = []
        for vm_elem in node_elm.findall(fixxpath(node_elm, 'Children/Vm')):
            public_ips = []
            private_ips = []
            other_ips = []

            for connection in vm_elem.findall(fixxpath(vm_elem, 'NetworkConnectionSection/NetworkConnection')):
                if connection.attrib['network'] != "none":
                    ip = connection.find(fixxpath(connection, "IpAddress"))
                    if connection.attrib['network'] == publicNetworkName:
                        public_ips.append(ip.text)
                    else:
                        if connection.attrib['network'] == self.defnet:
                            private_ips.append(ip.text)
                        else:
                            other_ips.append(ip.text)

            #デフォルトネットワークが無い(private_ipが無い)場合
            #その他の1つ目をprivate_ipへ設定
            if len(private_ips) == 0 and len(other_ips) > 0:
                private_ips.append(other_ips[0])

########################################
#プライベートIPの設定に関し別案
########################################
#            primary_ips = []
#            def_ips = []
#            primary_index = vm_elem.object.find(fixxpath(vm_elem, 'NetworkConnectionSection/PrimaryNetworkConnectionIndex')).text
#            for connection in vm_elem.findall(fixxpath(vm_elem, 'NetworkConnectionSection/NetworkConnection')):
#                if connection.attrib['network'] != "none":
#                    ip = connection.find(fixxpath(connection, "IpAddress"))
#                    index = connection.find(fixxpath(connection, "NetworkConnectionIndex"))
#                    if connection.attrib['network'] == publicNetworkName:
#                        public_ips.append(ip.text)
#                    else:
#                        if index == primary_index:
#                            primary_ips.append(ip.text)
#
#                        if connection.attrib['network'] == self.defnet:
#                            def_ips.append(ip.text)
#                        else:
#                            other_ips.append(ip.text)
#
#            #プライベートUPの設定順
#            #   1:プライマリネットワーク(PCCネットワークの場合は除外)
#            #   2:デフォルトネットワーク
#            #   3:その他ネットワーク
#            if len(primary_ips) != 0:
#                private_ips.append(primary_ips[0])
#            else:
#                if len(def_ips) != 0:
#                    private_ips.append(other_ips[0])
#                elif len(other_ips) > 0:
#                    private_ips.append(other_ips[0])

            #VMへ設定
            vm = {
                'id': vm_elem.get('href'),
                'name': vm_elem.get('name'),
                'state': self.NODE_STATE_MAP[vm_elem.get('status')],
                'public_ips': public_ips,
                'private_ips': private_ips,
                'storageprofile':vm_elem.find(fixxpath(vm_elem, 'StorageProfile')).get('name'),
            }
            vms.append(vm)

        # Take the node IP addresses from all VMs
        public_ips = []
        private_ips = []
        for vm in vms:
            public_ips.extend(vm['public_ips'])
            private_ips.extend(vm['private_ips'])

        # Find vDC
        vdc_id = next(link.get('href') for link in node_elm.findall(fixxpath(node_elm, 'Link'))
            if link.get('type') == 'application/vnd.vmware.vcloud.vdc+xml')
        vdc = next(vdc for vdc in self.vdcs if vdc.id == vdc_id)

        # Find TASK
        tasks = node_elm.findall(fixxpath(node_elm, 'Tasks/Task'))
        isTask = False
        if len(tasks) > 0:
            isTask = True

        node = Node(id=node_elm.get('href'),
                    name=node_elm.get('name'),
                    state=self.NODE_STATE_MAP[node_elm.get('status')],
                    public_ips=public_ips,
                    private_ips=private_ips,
                    driver=self.connection.driver,
                    extra={'vdc': vdc.name, 'vms': vms, 'task': isTask})
        return node
    def start(self, vdc, vApp, vm, vcInstance, pccInstance):
        # プラットフォーム
        platformTable = self.conn.getTable("PLATFORM")
        platform = self.conn.selectOne(platformTable.select(platformTable.c.PLATFORM_NO == pccInstance["PLATFORM_NO"]))

        tableIN = self.conn.getTable("VCLOUD_INSTANCE_NETWORK")
        instanceNw = self.conn.select(tableIN.select(tableIN.c.INSTANCE_NO == vcInstance["INSTANCE_NO"]))

        tableStorage = self.conn.getTable("PLATFORM_VCLOUD_STORAGE_TYPE")
        storage = self.conn.selectOne(
            tableStorage.select(tableStorage.c.STORAGE_TYPE_NO == vcInstance["STORAGE_TYPE_NO"])
        )

        # イベントログ出力
        self.conn.debug(
            pccInstance["FARM_NO"],
            None,
            None,
            pccInstance["INSTANCE_NO"],
            pccInstance["INSTANCE_NAME"],
            "VCloudInstanceStart",
            [platform["PLATFORM_NAME"], pccInstance["INSTANCE_NAME"]],
        )

        # インスタンスタイプの取得
        tableType = self.conn.getTable("PLATFORM_VCLOUD_INSTANCE_TYPE")
        instype = self.conn.selectOne(
            tableType.select(
                and_(
                    tableType.c.INSTANCE_TYPE_NAME == vcInstance["INSTANCE_TYPE"],
                    tableType.c.PLATFORM_NO == pccInstance["PLATFORM_NO"],
                )
            )
        )
        # 現状を取得
        setCpu = self.client.describeCPU(vm)
        setMemory = self.client.describeMemory(vm)

        # 変更が有れば通知
        if str(instype["CPU"]) != str(setCpu):
            self.client._change_vm_cpu(vm["id"], instype["CPU"])
        if str(instype["MEMORY"]) != str(setMemory):
            self.client._change_vm_memory(vm["id"], instype["MEMORY"])

        # ストレージ変更
        if storage["STORAGE_TYPE_NAME"] != vm["storageprofile"]:
            # 変更後のストレージプロファイル
            storageProfile = self.client.describeStorageProfile(vdc, storage["STORAGE_TYPE_NAME"])
            self.client.editInstance(vm, **{"storageProfile": storageProfile})

        # VAPPネットワークのアップデート確認
        self.client.checkNetwork(vApp, instanceNw)
        # IPアドレスの再設定
        self.client._change_vm_nw(vm["id"], instanceNw)

        # UserDataを作成
        userData = self.createUserData(pccInstance["INSTANCE_NO"], pccInstance, vcInstance)
        # PCCネットワークGWを設定
        vappnw = self.client.describeVappNetwork(vApp)
        for net in vappnw:
            if net.name == getOtherProperty("vCloud.PCCNetwork"):
                userData.update({"pccgateway": net.gateway})
                # ルーティングIP
                userData.update(self.createUserNetwork())

        # UserDataを整形
        userData = self.makeUserData(userData)

        # UserDataのキー とりあえず固定(VMWareと同一の物)
        key = "guestinfo.userdata"

        metadata = VCloudMetadataSet(key=key, value=userData)
        metadatas = [metadata]
        # ユーザーデータ登録
        self.client.setProductSections(vm, metadatas)

        # VCLOUD上のステータスを確認インスタンスが停止中
        startvm = None
        if vm["state"] == VCloudIaasClient.STOPPED:
            # インスタンスの起動
            node = self.client.startInstance(vApp, vm)
            startvm = self.client.describeInstance(node, vcInstance["VM_NAME"])
        else:
            # 既にスタートしている
            startvm = vm

        # イベントログ出力
        self.conn.debug(
            pccInstance["FARM_NO"],
            None,
            None,
            pccInstance["INSTANCE_NO"],
            pccInstance["INSTANCE_NAME"],
            "VCloudInstanceStartFinish",
            [platform["PLATFORM_NAME"], pccInstance["INSTANCE_NAME"]],
        )

        # データベース更新
        table = self.conn.getTable("VCLOUD_INSTANCE")
        updateDict = self.conn.selectOne(table.select(table.c.INSTANCE_NO == pccInstance["INSTANCE_NO"]))
        updateDict["STATUS"] = startvm["state"]
        publicIp = startvm["public_ips"]
        privateIp = startvm["private_ips"]
        if len(publicIp) > 0:
            updateDict["IP_ADDRESS"] = publicIp[0]
        if len(privateIp) > 0:
            updateDict["PRIVATE_IP_ADDRESS"] = privateIp[0]
        else:
            updateDict["PRIVATE_IP_ADDRESS"] = updateDict["IP_ADDRESS"]
        sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict)
        self.conn.execute(sql)

        # TODO ここでネットーワークインデックス等を更新
        self.reflectVMNetwork(vm, pccInstance["INSTANCE_NO"])
    def cloneVM(self, vdc, vApp, image, vcInstance, pccInstance):

        # イベントログ出力
        platformTable = self.conn.getTable("PLATFORM")
        platform = self.conn.selectOne(platformTable.select(platformTable.c.PLATFORM_NO == pccInstance["PLATFORM_NO"]))
        self.conn.debug(
            pccInstance["FARM_NO"],
            None,
            None,
            pccInstance["INSTANCE_NO"],
            pccInstance["INSTANCE_NAME"],
            "VCloudInstanceCreate",
            [platform["PLATFORM_NAME"], pccInstance["INSTANCE_NAME"]],
        )

        tableIN = self.conn.getTable("VCLOUD_INSTANCE_NETWORK")
        instanceNW = self.conn.select(tableIN.select(tableIN.c.INSTANCE_NO == vcInstance["INSTANCE_NO"]))

        tableStorage = self.conn.getTable("PLATFORM_VCLOUD_STORAGE_TYPE")
        storage = self.conn.selectOne(
            tableStorage.select(tableStorage.c.STORAGE_TYPE_NO == vcInstance["STORAGE_TYPE_NO"])
        )

        # イメージリンク
        imageHarf = self.client.describeImageHref(image["templateName"])

        # VAPPネットワークのアップデート確認
        self.client.checkNetwork(vApp, instanceNW)
        # ネットワーク設定 INDEX「0」にはPCCネットワークが入る為ダミーを設定
        useNetworks = [PccVMNetwork("", "", "", 0, 0)]
        for net in instanceNW:
            # PCCネットワーク
            if getOtherProperty("vCloud.PCCNetwork") == net["NETWORK_NAME"]:
                useNetworks[0] = PccVMNetwork(
                    net["NETWORK_NAME"], net["IP_ADDRESS"], net["IP_MODE"], 0, net["IS_PRIMARY"]
                )
            else:
                useNetworks.append(
                    PccVMNetwork(
                        net["NETWORK_NAME"], net["IP_ADDRESS"], net["IP_MODE"], net["NETWORK_INDEX"], net["IS_PRIMARY"]
                    )
                )

        # ストレージ
        storageProfile = self.client.describeStorageProfile(vdc, storage["STORAGE_TYPE_NAME"])

        # パラメータ作成
        info = {
            "image": imageHarf,
            "vm_name": pccInstance["INSTANCE_NAME"],
            "vm_storage": storageProfile,
            "vm_networks": useNetworks,
            "fqdn": pccInstance["FQDN"],
        }

        # 仮想マシンを作成
        node = self.client.createInstances(vApp, **info)
        vm = self.client.describeInstance(node, pccInstance["INSTANCE_NAME"])
        self.logger.info(vm)
        # イベントログ出力
        self.conn.debug(
            pccInstance["FARM_NO"],
            None,
            None,
            pccInstance["INSTANCE_NO"],
            pccInstance["INSTANCE_NAME"],
            "VCloudInstanceCreateFinish",
            [platform["PLATFORM_NAME"], pccInstance["INSTANCE_NAME"]],
        )

        # データベース更新
        tableVCINS = self.conn.getTable("VCLOUD_INSTANCE")
        updateDict = self.conn.selectOne(tableVCINS.select(tableVCINS.c.INSTANCE_NO == pccInstance["INSTANCE_NO"]))
        updateDict["VM_NAME"] = vm["name"]
        updateDict["STATUS"] = vm["state"]
        publicIp = vm["public_ips"]
        privateIp = vm["private_ips"]
        if len(publicIp) > 0:
            updateDict["IP_ADDRESS"] = publicIp[0]
        if len(privateIp) > 0:
            updateDict["PRIVATE_IP_ADDRESS"] = privateIp[0]
        else:
            updateDict["PRIVATE_IP_ADDRESS"] = updateDict["IP_ADDRESS"]

        sql = tableVCINS.update(tableVCINS.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict)
        self.conn.execute(sql)

        # TODO ここでネットーワークインデックスを更新
        self.reflectVMNetwork(vm, pccInstance["INSTANCE_NO"])

        return vm