def _BuildFullMapUpdateTestHelper(self, expected_patch, clear, remove_keys=None, set_entries=None, initial_entries=None): """Helper for testing BuildFullMapUpdate. Using this helper, one can test that BuildFullMapUpdate combines `clear`, `remove_keys`, `set_entries`, and `initial_entries` (in that order) to build a patch object. Args: expected_patch: dict, a dictionary of the key-value pairs expected to be in the patch clear: bool, the value of the clear parameter to pass through remove_keys: [str], the value of the remove_keys parameter to pass through set_entries: {str: str}, the value of the set_entries parameter to pass through initial_entries: dict, a dictionary of the key-value pairs in the initial entry """ actual_patch = command_util.BuildFullMapUpdate( clear=clear, remove_keys=remove_keys, set_entries=set_entries, initial_entries=[ UtilGATest._FakeEntry(key=key, value=value) for key, value in six.iteritems(initial_entries or {}) ], entry_cls=UtilGATest._FakeEntry, env_builder=UtilGATest._FakePatchBuilder) self.assertEqual(expected_patch, actual_patch)
def _ConstructEnvVariablesPatch(env_ref, clear_env_variables, remove_env_variables, update_env_variables, release_track=base.ReleaseTrack.GA): """Constructs an environment patch for updating environment variables. Note that environment variable updates do not support partial update masks unlike other map updates due to comments in (b/78298321). For this reason, we need to retrieve the Environment, apply an update on EnvVariable dictionary, and patch the entire dictionary. The potential race condition here (environment variables being updated between when we retrieve them and when we send patch request)is not a concern since environment variable updates take 5 mins to complete, and environments cannot be updated while already in the updating state. Args: env_ref: resource argument, Environment resource argument for environment being updated. clear_env_variables: bool, whether to clear the environment variables dictionary. remove_env_variables: iterable(string), Iterable of environment variable names to remove. update_env_variables: {string: string}, dict of environment variable names and values to set. release_track: base.ReleaseTrack, the release track of command. Will dictate which Composer client library will be used. Returns: (str, Environment), the field mask and environment to use for update. """ env_obj = environments_api_util.Get(env_ref, release_track=release_track) initial_env_var_value = env_obj.config.softwareConfig.envVariables initial_env_var_list = (initial_env_var_value.additionalProperties if initial_env_var_value else []) messages = api_util.GetMessagesModule(release_track=release_track) env_cls = messages.Environment env_variables_cls = messages.SoftwareConfig.EnvVariablesValue entry_cls = env_variables_cls.AdditionalProperty def _BuildEnv(entries): software_config = messages.SoftwareConfig( envVariables=env_variables_cls(additionalProperties=entries)) config = messages.EnvironmentConfig(softwareConfig=software_config) return env_cls(config=config) return ('config.software_config.env_variables', command_util.BuildFullMapUpdate(clear_env_variables, remove_env_variables, update_env_variables, initial_env_var_list, entry_cls, _BuildEnv))