Как добавить пользователя в DevOps Azure с помощью клиентского API Python? - PullRequest
1 голос
/ 14 июня 2019

Я пишу скрипт на Python для добавления пользователя (существующего пользователя из провайдера AAD) в DevOps Azure. Для этой цели я использую клиентскую библиотеку Python Azure DevOps. После аутентификации я могу получить пользователей из Azure Devops как:

# Create a connection to the org
credentials = BasicAuthentication('', personal_access_token)
connection = Connection(base_url=organization_url, creds=credentials)

# Get a client (the "graph" client provides access to list,get and create user)
graph_client = connection.clients_v5_0.get_graph_client()
resp = graph_client.list_users()

# Access the properties of object as object.property
users = resp.graph_users

# Show details about each user in the console
for user in users:
    pprint.pprint(user.__dict__)
    print("\n")

Как добавить пользователя, использующего это соединение GraphClient?

Для этого есть функция create_user (используется как graph_client.create_user()): https://github.com/microsoft/azure-devops-python-api/blob/dev/azure-devops/azure/devops/v5_0/graph/graph_client.py

В нем говорится, что запрос должен включать GraphUserCreationContext в качестве входного параметра.

Но как я могу получить этот GraphUserCreationContext для пользователя AAD? В качестве входных данных у меня есть только информация об UPN пользователя AAD.

Примечание:

Я нашел образец .NET для этого здесь: https://github.com/microsoft/azure-devops-dotnet-samples/blob/master/ClientLibrary/Samples/Graph/UsersSample.cs

Он использует GraphUserPrincipalNameCreationContext, который расширяет GraphUserCreationContext.

Но я не смог найти такой класс в клиентской библиотеке Python. Я использовал такой код:

addAADUserContext = GraphUserCreationContext('anaya.john@domain.com')
print(addAADUserContext)
resp = graph_client.create_user(addAADUserContext)
print(resp) 

Но получил ошибку:

azure.devops.exceptions.AzureDevOpsServiceError: VS860015: Must have exactly one of originId or principalName set.

1 Ответ

1 голос
/ 24 июня 2019

GraphUserCreationContext класс от клиента Python для Azure Devops REST API принимает только один входной параметр, который является StorageKey.Следовательно, что бы вы ни указывали в качестве входного параметра для этой функции, будь то UPN или ID, оно устанавливается в качестве ключа хранилища.

Если вы напечатаете объект addAADUserContext, вы получите:

{'additional_properties': {}, 'storage_key': 'anaya.john@domain.com'}

Но для функции create_user() клиента Graph необходим только один из originId или PrincipalName, установленный в GraphUserCreationContext, который он принимает в качестве входного параметра.

В качестве документации Microsoft для REST API Azure Devops(https://docs.microsoft.com/en-us/rest/api/azure/devops/graph/users/create?view=azure-devops-rest-4.1):

Тело запроса должно быть производным типом GraphUserCreationContext:

  • GraphUserMailAddressCreationContext
  • GraphUserOriginIdCreationContext
  • GraphUserPrincipalNameCreationContext

Мы не должны использовать объект GraphUserCreationContext напрямую.Но такие классы, как GraphUserPrincipalNameCreationContext, в настоящее время недоступны в клиентском API Python.Они работают над этим.Вы можете отследить проблему здесь в репозитории GitHub: https://github.com/microsoft/azure-devops-python-api/issues/176

Вы можете использовать Права пользователя - Добавить REST API для лазурных девопов вместо его Graph API.Для этой цели вы можете использовать следующий клиент Python:

https://github.com/microsoft/azure-devops-python-api/tree/dev/azure-devops/azure/devops/v5_0/member_entitlement_management

Вы можете обратиться к примеру, приведенному в следующем вопросе, чтобы узнать, как использовать упомянутый клиент Python:

Невозможно десериализовать объект: type, KeyError: 'key: int;значение: стр '

...