diff --git a/api/plugins/action/env_variable.py b/api/plugins/action/env_variable.py index 4170f59..83efa7e 100644 --- a/api/plugins/action/env_variable.py +++ b/api/plugins/action/env_variable.py @@ -25,6 +25,10 @@ def run(self, tmp=None, task_vars=None): value = self._task.args.get('value', None) scope = self._task.args.get('scope', None) replace_existing = self._task.args.get('replace_existing', False) + + # These, used to add and update, are filled in below + lagoon_project_name = None + lagoon_environment_name = None self.createClient(task_vars) @@ -50,9 +54,10 @@ def run(self, tmp=None, task_vars=None): type_id = lagoonProject.projects[0]['id'] env_vars = lagoonProject.projects[0]['envVariables'] self._display.v("Project variables: %s" % env_vars) + lagoon_project_name = type_name elif (type == 'ENVIRONMENT'): lagoonEnvironment.byNs( - type_name, ['id', 'kubernetesNamespaceName']) + type_name, ['id', 'name', 'kubernetesNamespaceName', "project {id, name}"]) if not len(lagoonEnvironment.environments): raise AnsibleError("Environment not found.") @@ -60,8 +65,9 @@ def run(self, tmp=None, task_vars=None): self._display.v(f"environment: {lagoonEnvironment.environments[0]}") type_id = lagoonEnvironment.environments[0]['id'] env_vars = lagoonEnvironment.environments[0]['envVariables'] + lagoon_environment_name = lagoonEnvironment.environments[0]['name'] + lagoon_project_name = lagoonEnvironment.environments[0]['project']['name'] self._display.v("Environment variables: %s" % env_vars) - if env_vars == None: raise AnsibleError( "Incorrect variable type: %s. Should be PROJECT or ENVIRONMENT." % type) @@ -107,13 +113,10 @@ def run(self, tmp=None, task_vars=None): result['id'] = existing_var['id'] return result - # Delete before recreating. - lagoonVariable.delete(existing_var['id']) - if state == 'absent': return result - result['data'] = lagoonVariable.add(type, type_id, name, value, scope) + result['data'] = lagoonVariable.addOrUpdateByName(lagoon_project_name, lagoon_environment_name, name, value, scope) self._display.v("Variable add result: %s" % result['data']) result['changed'] = True diff --git a/api/plugins/action/list.py b/api/plugins/action/list.py index 65524fd..583a86d 100644 --- a/api/plugins/action/list.py +++ b/api/plugins/action/list.py @@ -19,6 +19,8 @@ class ActionModule(LagoonActionBase): def run(self, tmp=None, task_vars=None): + self._display.v("Task args: %s" % self._task.args) + if task_vars is None: task_vars = dict() diff --git a/api/plugins/module_utils/gqlVariable.py b/api/plugins/module_utils/gqlVariable.py index 3c7f2e9..dced88d 100644 --- a/api/plugins/module_utils/gqlVariable.py +++ b/api/plugins/module_utils/gqlVariable.py @@ -44,19 +44,19 @@ def getForProjects(self, project_names: List[str], fields: List[str] = None) -> return res - def add(self, type: str, type_id: int, name: str, value: str, scope: str) -> dict: + def addOrUpdateByName(self, projectName:str, environmentName: str, name:str, value:str, scope:str) -> dict: res = self.client.execute_query( """ - mutation addEnvVariable( - $type: EnvVariableType! - $type_id: Int! + mutation addOrUpdateEnvVariableByName( + $environment: String + $project: String! $name: String! $value: String! $scope: EnvVariableScope! ) { - addEnvVariable(input: { - type: $type - typeId: $type_id + addOrUpdateEnvVariableByName(input: { + project: $project + environment: $environment scope: $scope name: $name value: $value @@ -65,14 +65,14 @@ def add(self, type: str, type_id: int, name: str, value: str, scope: str) -> dic } }""", { - "type": type, - "type_id": int(type_id), + "environment": environmentName, + "project": projectName, "scope": scope, "name": name, "value": str(value), } ) - return res['addEnvVariable'] + return res['addOrUpdateEnvVariableByName'] def delete(self, id: int) -> bool: res = self.client.execute_query( diff --git a/api/tests/unit/plugins/module_utils/test_gql_variable.py b/api/tests/unit/plugins/module_utils/test_gql_variable.py index b1bd38d..e236a65 100644 --- a/api/tests/unit/plugins/module_utils/test_gql_variable.py +++ b/api/tests/unit/plugins/module_utils/test_gql_variable.py @@ -10,18 +10,18 @@ class GqlVariableTester(unittest.TestCase): - def test_add(self): + def test_variable_addOrUpdateByName(self): client = GqlClient('foo', 'bar') client.execute_query = MagicMock() lagoonVariable = Variable(client) - lagoonVariable.add('PROJECT', 1, 'SOME_VAR', 'foo', 'RUNTIME') + lagoonVariable.addOrUpdateByName('projectname', "environmentname", 'SOME_VAR', 'foo', 'RUNTIME') _, query_args = client.execute_query.call_args.args - assert isinstance(query_args['type'], str) - assert query_args['type'] == 'PROJECT' - assert isinstance(query_args['type_id'], int) - assert query_args['type_id'] == 1 + assert isinstance(query_args['project'], str) + assert query_args['project'] == 'projectname' + assert isinstance(query_args['environment'], str) + assert query_args['environment'] == 'environmentname' assert isinstance(query_args['scope'], str) assert query_args['scope'] == 'RUNTIME' assert isinstance(query_args['name'], str) @@ -35,12 +35,12 @@ def test_add_value_cast_to_string(self): lagoonVariable = Variable(client) - lagoonVariable.add('PROJECT', 1, 'SOME_VAR', True, 'RUNTIME') + lagoonVariable.addOrUpdateByName('projectname', "environmentname", 'SOME_VAR', True, 'RUNTIME') _, query_args = client.execute_query.call_args.args assert isinstance(query_args['value'], str) assert query_args['value'] == 'True' - lagoonVariable.add('PROJECT', 1, 'SOME_VAR2', 50, 'RUNTIME') + lagoonVariable.addOrUpdateByName('projectname', "environmentname", 'SOME_VAR2', 50, 'RUNTIME') _, query_args = client.execute_query.call_args.args assert isinstance(query_args['value'], str) assert query_args['value'] == '50'