+def ram_client():
+ """Construct resource access management client"""
+ cred = credentials.client.Client()
+ conf = openapi.models.Config(credential=cred, endpoint=RAM_ENDPOINT)
+ client = ram.client.Client(conf)
+ return client
+
+def setup_censorship_bypass_role(client):
+ """Set up censorship bypass role (required for importing images)"""
+ role_name = IPXE_CENSORSHIP_BYPASS_ROLE_NAME
+ assume_policy = json.dumps(IPXE_CENSORSHIP_BYPASS_ROLE_ASSUME_POLICY)
+ req = ram.models.GetRoleRequest(
+ role_name=role_name,
+ )
+ try:
+ rsp = client.get_role(req)
+ arn = rsp.body.role.arn
+ except openapi.exceptions.ClientException as exc:
+ if exc.code != 'EntityNotExist.Role':
+ raise
+ req = ram.models.CreateRoleRequest(
+ role_name=role_name,
+ assume_role_policy_document=assume_policy,
+ )
+ rsp = client.create_role(req)
+ arn = rsp.body.role.arn
+ req = ram.models.UpdateRoleRequest(
+ role_name=role_name,
+ new_assume_role_policy_document=assume_policy,
+ new_description="iPXE role to help bypass OSS censorship restrictions",
+ )
+ rsp = client.update_role(req)
+ req = ram.models.AttachPolicyToRoleRequest(
+ role_name=role_name,
+ policy_type='System',
+ policy_name='AliyunOSSFullAccess',
+ )
+ try:
+ rsp = client.attach_policy_to_role(req)
+ except openapi.exceptions.ClientException as exc:
+ if exc.code != 'EntityAlreadyExists.Role.Policy':
+ raise
+ return arn
+