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)
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
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