Невозможно выполнить итерацию по объекту Azure ADGroupPaged в python

#python-3.x #azure

#python-3.x #azure

Вопрос:

Экспериментирую с python3 для составления списка групп объявлений, но я заблокирован из-за ошибки при попытке перебора класса ADPagedGroup… используемые пакеты azure = 4.0.0 и azure-graphrbac = 0.61.0

Я пробовал использовать 2 версии azure-graphrbac 0.40.0, поскольку это то, что требуется Azure 4.0.0, и с 0.61.0 ошибки в любом случае.

these_groups это тип ADGroupPaged, но на сайте Microsoft нет примеров или документов, которые имели бы смысл для меня.

В приведенном ниже коде я пробовал различные варианты итерации по объекту these_groups

 # ./adal_test1.py ## piece of shoe

from azure.common.credentials import get_azure_cli_credentials
from azure.graphrbac import GraphRbacManagementClient
from azure.common.credentials import ServicePrincipalCredentials
from azure.graphrbac.models import GroupCreateParameters, GroupAddMemberParameters   

# client_id, secret and tenant_id defined in list, but redacted here

credentials = ServicePrincipalCredentials(
    client_id=client_id,
    secret=secret,
    tenant=tenant_id
)

try:
    these_groups = graphrbac_client.groups.list()

except expression as identifier:
    print('Huh, why?')

finally:
    for a in vars(these_groups):
        print("DEBUG: VAR::",a)

    for b in these_groups:
    #also    these_groups.list:
    # "           "      .list():
    # "           "      .list():
    # "           "      ._get_next:
    # "           "      .current_page:   # NOTHING RETURNED
       print('DEBUG: B is::',b)           # <-- we NEVER make it here
       for c in vars(b):
            print('DEBUG: LOOP LIST::',c)

 

Результат pip3 adal_test1.py

 VAR: _async_get_next
VAR: next_link
VAR: _current_page_iter_index
VAR: current_page
VAR: _derserializer
VAR: _get_next
VAR: _response
VAR: _raw_headers
Traceback (most recent call last):
  File "adal_test1.py", line 50, in <module>
    for b in these_groups:
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/paging.py", line 143, in __next__
    self.advance_page()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/paging.py", line 129, in advance_page
    self._response = self._get_next(self.next_link)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/azure/graphrbac/operations/groups_operations.py", line 306, in internal_paging
 

Просто хочу ссылаться на каждую возвращенную группу объявлений, но не могу понять, как использовать выгружаемый объект.

выборка сбоев

 for b in these_groups._get_next:
     TypeError: 'function' object is not iterable
 
 for b in these_groups:
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/paging.py", line 143, in __next__
    self.advance_page()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/paging.py", line 129, in advance_page
    self._response = self._get_next(self.next_link)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/azure/graphrbac/operations/groups_operations.py", line 306, in internal_paging
    url = self._client.format_url(url, **path_format_arguments)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/service_client.py", line 155, in format_url
    base = self.config.base_url.format(**kwargs).rstrip('/')
AttributeError: 'tuple' object has no attribute 'format'
 
     for b in these_groups.list:
AttributeError: 'ADGroupPaged' object has no attribute 'list'
 

Интересная разница, однако, с методами current_page и next_link ничего не возвращается,

Комментарии:

1. Пожалуйста, попробуйте это for g in graphrbac_client.groups.list(): print('DEBUG: LOOP LIST::',g.object_id)

2. почему бы вам просто не выполнить dir(b) и посмотреть, что он предлагает? или установить точку останова и тщательно изучить объект?

3. Спасибо за ответы, но выглядит более сложным, чем пара циклов над вызовом метода. Заглянул в нутро azure-cli ( а-ля: azure-sdk_for-python ), чтобы обнаружить, что они используют рекурсивную функцию, вызываемую internal_paging с некоторой десериализацией, для обхода ADGroupPaged объекта, См. Строки: 298-344 Я новичок @ python, так что все это хороший опыт обучения.

Ответ №1:

Оказывается, решение моего вопроса было довольно простым, просто неочевидным в какой-либо документации MS или иным образом (которую я смог найти)

Два изменения:

1) Обязательно. Для вызовов ActiveDirectory конструкции ServicePrincipalCredentials требуется, чтобы параметр resource был специально установлен на graph.windows.net

например

 resource_adgraph = "https://graph.windows.net"
credentials = ServicePrincipalCredentials(
    client_id=client_id,
    secret=secret,
    tenant=tenant_id,
    resource=resource_adgraph
)

graphrbac_client = GraphRbacManagementClient( 
    credentials, 
    tenant_id
)
 

2) Необязательно. Импортируйте ADGroup класс

 from azure.graphrbac.models import GroupCreateParameters, GroupAddMemberParameters, GetObjectsParameters, ADGroup
 

Новый вывод: с отредактированными соответствующими именами

 . . .
DEBUG: VAR:: _async_get_next
DEBUG: VAR:: next_link
DEBUG: VAR:: _current_page_iter_index
DEBUG: VAR:: current_page
DEBUG: VAR:: _derserializer
DEBUG: VAR:: _get_next
DEBUG: VAR:: _response
DEBUG: VAR:: _raw_headers
DEBUG: B is:: {'additional_properties': {'dirSyncEnabled': None, 'onPremisesDomainName': None, 'odata.type': 'Microsoft.DirectoryServices.Group', 'onPremisesSamAccountName': None, 'provisioningErrors': [], 'proxyAddresses': [], 'description': None, 'onPremisesSecurityIdentifier': None, 'lastDirSyncTime': None, 'onPremisesNetBiosName': None}, 'object_id': '04b__VALUE_REDACTED__43e', 'deletion_timestamp': None, 'object_type': 'Group', 'display_name': '__VALUE_REDACTED__', 'mail_enabled': False, 'mail_nickname': '__VALUE_REDACTED__', 'security_enabled': True, 'mail': None}
RAW ADGraph object:  __GROUP__NAME__REDACTED__
DEBUG: LOOP LIST:: additional_properties
DEBUG: LOOP LIST:: object_id
DEBUG: LOOP LIST:: deletion_timestamp
DEBUG: LOOP LIST:: object_type
DEBUG: LOOP LIST:: display_name
DEBUG: LOOP LIST:: mail_enabled
DEBUG: LOOP LIST:: mail_nickname
DEBUG: LOOP LIST:: security_enabled
DEBUG: LOOP LIST:: mail
. . . [snip] . . .