Как использовать класс Azure-Python SDK `ResourcesMoveInfo` в python

#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

ссылка из — https://docs.microsoft.com/en-us/python/api/azure-mgmt-resource/azure.mgmt.resource.resources.v2019_07_01.models.resourcesmoveinfo?view=azure-python

Использование:

 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, которую я дал, и можете объединить его в своей локальной папке.