#python #azure #azure-sdk-python
#python #azure #azure-sdk-python
Вопрос:
Я наткнулся на этот класс python ResourcesMoveInfo
для перемещения ресурсов (изображений Azure) из одной подписки в другую с помощью Azure python SDK.
Но он терпит неудачу, когда я использую его, как показано ниже:
Шаблон 1
ссылка из https://buildmedia.readthedocs.org/media/pdf/azure-sdk-for-python/v1.0.3/azure-sdk-for-python.pdf
Использование:
metadata = azure.mgmt.resource.resourcemanagement.ResourcesMoveInfo(resources=rid,target_resource_group='/subscriptions/{0}/resourceGroups/{1}'.format(self.prod_subscription_id,self.resource_group))
Ошибка:
AttributeError: module 'azure.mgmt.resource' has no attribute 'resourcemanagement'
Шаблон 2
Использование:
metadata = azure.mgmt.resource.resources.v2020_06_01.models.ResourcesMoveInfo(resources=rid,target_resource_group='/subscriptions/{0}/resourceGroups/{1}'.format(self.prod_subscription_id,self.resource_group))
Ошибка:
AttributeError: module 'azure.mgmt.resource.resources' has no attribute 'v2020_06_01'
Любая помощь по этому требованию / проблеме была бы полезна. Спасибо!
Добавление фрагмента кода здесь:
import sys
import os
import time
from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
import azure.mgmt.resource
#from azure.mgmt.resource.resources.v2020_06_01.models import ResourcesMoveInfo
from azure.identity import ClientSecretCredential
from cred_wrapper import CredentialWrapper
class Move():
def __init__(self):
self.nonprod_subscription_id = "abc"
self.prod_subscription_id = "def"
self.credential = ClientSecretCredential(
client_id= os.environ["ARM_CLIENT_ID"],
client_secret= os.environ["ARM_CLIENT_SECRET"],
tenant_id= os.environ["ARM_TENANT_ID"]
)
#resource client for nonprod
self.sp = CredentialWrapper(self.credential)
self.resource_client = ResourceManagementClient(self.sp,self.nonprod_subscription_id)
self.resource_group = "imgs-rg"
def getresourceids(self):
resource_ids = list(resource.id for resource in self.resource_client.resources.list_by_resource_group("{0}".format(self.resource_group)) if resource.id.find("latest")>=0)
return resource_ids
def getresourcenames(self):
resource_names = list(resource.name for resource in self.resource_client.resources.list_by_resource_group("{0}".format(self.resource_group)) if resource.id.find("latest")>=0)
return resource_names
def deleteoldimages(self,name):
#resource client id for prod
rc = ResourceManagementClient(self.sp,self.prod_subscription_id)
for resource in rc.resources.list_by_resource_group("{0}".format(self.resource_group)):
if resource.name == name:
#2019-12-01 is the latest api_version supported for deleting the resource type "image"
rc.resources.begin_delete_by_id(resource.id,"2020-06-01")
print("deleted {0}".format(resource.name))
def moveimages(self):
rnames = self.getresourcenames()
for rname in rnames:
print(rname)
#self.deleteoldimages(rname)
time.sleep(10)
rids = self.getresourceids()
rid = list(rids[0:])
print(rid)
metadata = azure.mgmt.resource.resources.v2020_06_01.models.ResourcesMoveInfo(resources=rid,target_resource_group='/subscriptions/{0}/resourceGroups/{1}'.format(self.prod_subscription_id,self.resource_group))
#moving resources in the rid from nonprod subscription to prod subscription under the resource group avrc-imgs-rg
if rid != []:
print("moving {0}".format(rid))
print(self.resource_client.resources.move_resources(source_resource_group_name="{0}".format(self.resource_group),parameters=metadata))
#self.resource_client.resources.move_resources(source_resource_group_name="{0}".format(self.resource_group),resources=rid,target_resource_group='/subscriptions/{0}/resourceGroups/{1}'.format(self.prod_subscription_id,self.resource_group))
#self.resource_client.resources.begin_move_resources(source_resource_group_name="{0}".format(self.resource_group),parameters=metadata)
if __name__ == "__main__":
Move().moveimages()
Комментарии:
1. Можете ли вы предоставить полную трассировку ошибок, чтобы проверить путь возникновения сообщения об ошибке.
Ответ №1:
Из ваших входных данных мы видим, что код выглядит нормально. Судя по вашим сообщениям об ошибках, проблема связана с импортом модулей.
В основном, когда мы импортируем модуль, несколько подмодулей будут установлены вместе, а несколько — нет. Это будет зависеть от версии пакета, чтобы понять, какие модули задействованы в конкретной версии, нам нужно проверить наличие версий в официальной документации.
В вашем случае, похоже, некоторые модули ресурсов отсутствовали, если бы вы могли видеть всю трассировку ошибок, в нашем локальном будет путь с sitepackages. Попробуйте найти этот пакет и его подпапку (модули) и сравнить их с Azure SDK для Python в разделе Resource module, вы можете найти это здесь.
В такой ситуации нам необходимо явно добавить эти вспомогательные модули в наш пакет. В вашем случае вы можете просто загрузить упакованный код по ссылке Git, которую я дал, и можете объединить его в своей локальной папке.