# -*- coding: utf-8 -*- # # Copyright 2023 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Helper functions for constructing and validating AlloyDB user requests.""" from __future__ import absolute_import from __future__ import division from __future__ import unicode_literals from googlecloudsdk.core import properties def ConstructCreateRequestFromArgs(client, alloydb_messages, cluster_ref, args): """Validates command line input arguments and passes parent's resources. Args: client: Client for api_utils.py class. alloydb_messages: Messages module for the API client. cluster_ref: parent resource path of the resource being created args: Command line input arguments. Returns: Fully-constructed request to create an AlloyDB user. """ user_resource = alloydb_messages.User() user_ref = client.resource_parser.Create( 'alloydb.projects.locations.clusters.users', projectsId=properties.VALUES.core.project.GetOrFail, locationsId=args.region, clustersId=args.cluster, usersId=args.username, ) user_resource.name = user_ref.RelativeName() # set password if provided if args.password: user_resource.password = args.password # set user type if provided user_resource.userType = _ParseUserType(alloydb_messages, args.type) # set database roles if provided if args.db_roles: user_resource.databaseRoles = args.db_roles # set superuser role if provided if args.superuser: user_resource.databaseRoles.append('alloydbsuperuser') # set keep extra roles if provided if args.keep_extra_roles: user_resource.keepExtraRoles = args.keep_extra_roles return alloydb_messages.AlloydbProjectsLocationsClustersUsersCreateRequest( user=user_resource, userId=args.username, parent=cluster_ref.RelativeName(), ) def ConstructPatchRequestFromArgs(alloydb_messages, user_ref, args): """Constructs the request to update an AlloyDB instance. Args: alloydb_messages: Messages module for the API client. user_ref: parent resource path of the resource being updated args: Command line input arguments. Returns: Fully-constructed request to update an AlloyDB user. """ user_resource, mask = ConstructUserAndMaskFromArgs( alloydb_messages, user_ref, args ) return alloydb_messages.AlloydbProjectsLocationsClustersUsersPatchRequest( user=user_resource, name=user_ref.RelativeName(), updateMask=mask ) def ConstructUserAndMaskFromArgs(alloydb_messages, user_ref, args): """Validates command line arguments and creates the user and field mask. Args: alloydb_messages: Messages module for the API client. user_ref: resource path of the resource being updated args: Command line input arguments. Returns: An AlloyDB user and mask for update. """ password_path = 'password' database_roles_path = 'database_roles' user_resource = alloydb_messages.User() user_resource.name = user_ref.RelativeName() # handle set-password if 'set-password' in args.command_path: user_resource.password = args.password return user_resource, password_path # handle set-database-roles if 'set-roles' in args.command_path: user_resource.databaseRoles = args.db_roles # set keep extra roles if provided if args.keep_extra_roles: user_resource.keepExtraRoles = args.keep_extra_roles return user_resource, database_roles_path # handle set-superuser if 'set-superuser' in args.command_path: if args.superuser: args.db_roles.append('alloydbsuperuser') else: args.db_roles.remove('alloydbsuperuser') user_resource.databaseRoles = args.db_roles return user_resource, database_roles_path return user_resource, None def _ParseUserType(alloydb_messages, user_type): if user_type == 'BUILT_IN': return alloydb_messages.User.UserTypeValueValuesEnum.ALLOYDB_BUILT_IN elif user_type == 'IAM_BASED': return alloydb_messages.User.UserTypeValueValuesEnum.ALLOYDB_IAM_USER return None