From e9fa788d0206dad783078796bdfcf6ee3a82ed90 Mon Sep 17 00:00:00 2001 From: Jorge Gallegos Date: Tue, 19 Aug 2025 18:30:13 -0700 Subject: [PATCH 1/2] These modules are no longer offered by Google Google Cloud does not host source repositories anymore, they provide connections to other source code providers (e.g. github, gitlab, bitbucket) Likewise, they stopped offering their ML products in favor of Vertex AI. The modules that use these APIs are currently broken and, given that the upstream actively discourages you to use them, are not worth to fix imo. --- meta/runtime.yml | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/meta/runtime.yml b/meta/runtime.yml index 2ffac082b..5a3516bcf 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -20,7 +20,30 @@ plugin_routing: new customers. If your organization hasn't previously used Cloud Source Repositories, you can't enable the API or use Cloud Source Repositories. - Please use M(google.cloud.gcp_cloudbuildv2_repository) instead. + gcp_mlengine_model: + tombstone: + removal_date: 2025-01-31 + warning_text: > + Cloud AI Platform is deprecated and access will be discontinued + January 31 2025 in favor of Vertex AI. + gcp_mlengine_model_info: + tombstone: + removal_date: 2025-01-31 + warning_text: > + Cloud AI Platform is deprecated and access will be discontinued + January 31 2025 in favor of Vertex AI. + gcp_mlengine_version: + tombstone: + removal_date: 2025-01-31 + warning_text: > + Cloud AI Platform is deprecated and access will be discontinued + January 31 2025 in favor of Vertex AI. + gcp_mlengine_version_info: + tombstone: + removal_date: 2025-01-31 + warning_text: > + Cloud AI Platform is deprecated and access will be discontinued + January 31 2025 in favor of Vertex AI. action_groups: gcp: From 2f250d77419cdf9f39966a58f5495f915b4d6e4e Mon Sep 17 00:00:00 2001 From: Jorge Gallegos Date: Tue, 14 Apr 2026 12:15:12 -0600 Subject: [PATCH 2/2] Actually remove code for mlengine plugins --- plugins/modules/gcp_mlengine_model.py | 444 ------------ plugins/modules/gcp_mlengine_model_info.py | 212 ------ plugins/modules/gcp_mlengine_version.py | 639 ------------------ plugins/modules/gcp_mlengine_version_info.py | 304 --------- .../targets/gcp_mlengine_model/aliases | 1 - .../gcp_mlengine_model/defaults/main.yml | 2 - .../targets/gcp_mlengine_model/meta/main.yml | 0 .../gcp_mlengine_model/tasks/autogen.yml | 113 ---- .../targets/gcp_mlengine_model/tasks/main.yml | 3 - .../targets/gcp_mlengine_version/aliases | 2 - .../gcp_mlengine_version/defaults/main.yml | 2 - .../gcp_mlengine_version/meta/main.yml | 0 .../gcp_mlengine_version/tasks/autogen.yml | 155 ----- .../gcp_mlengine_version/tasks/main.yml | 3 - 14 files changed, 1880 deletions(-) delete mode 100644 plugins/modules/gcp_mlengine_model.py delete mode 100644 plugins/modules/gcp_mlengine_model_info.py delete mode 100644 plugins/modules/gcp_mlengine_version.py delete mode 100644 plugins/modules/gcp_mlengine_version_info.py delete mode 100644 tests/integration/targets/gcp_mlengine_model/aliases delete mode 100644 tests/integration/targets/gcp_mlengine_model/defaults/main.yml delete mode 100644 tests/integration/targets/gcp_mlengine_model/meta/main.yml delete mode 100644 tests/integration/targets/gcp_mlengine_model/tasks/autogen.yml delete mode 100644 tests/integration/targets/gcp_mlengine_model/tasks/main.yml delete mode 100644 tests/integration/targets/gcp_mlengine_version/aliases delete mode 100644 tests/integration/targets/gcp_mlengine_version/defaults/main.yml delete mode 100644 tests/integration/targets/gcp_mlengine_version/meta/main.yml delete mode 100644 tests/integration/targets/gcp_mlengine_version/tasks/autogen.yml delete mode 100644 tests/integration/targets/gcp_mlengine_version/tasks/main.yml diff --git a/plugins/modules/gcp_mlengine_model.py b/plugins/modules/gcp_mlengine_model.py deleted file mode 100644 index e3edaacec..000000000 --- a/plugins/modules/gcp_mlengine_model.py +++ /dev/null @@ -1,444 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2017 Google -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** Type: MMv1 *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -################################################################################ -# Documentation -################################################################################ - -ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ["preview"], 'supported_by': 'community'} - -DOCUMENTATION = ''' ---- -module: gcp_mlengine_model -description: -- Represents a machine learning solution. -- A model can have multiple versions, each of which is a deployed, trained model ready - to receive prediction requests. The model itself is just a container. -short_description: Creates a GCP Model -author: Google Inc. (@googlecloudplatform) -requirements: -- python >= 2.6 -- requests >= 2.18.4 -- google-auth >= 1.3.0 -options: - state: - description: - - Whether the given object should exist in GCP - choices: - - present - - absent - default: present - type: str - name: - description: - - The name specified for the model. - required: true - type: str - description: - description: - - The description specified for the model when it was created. - required: false - type: str - default_version: - description: - - The default version of the model. This version will be used to handle prediction - requests that do not specify a version. - required: false - type: dict - suboptions: - name: - description: - - The name specified for the version when it was created. - required: true - type: str - regions: - description: - - The list of regions where the model is going to be deployed. - - Currently only one region per model is supported . - elements: str - required: false - type: list - online_prediction_logging: - description: - - If true, online prediction access logs are sent to StackDriver Logging. - required: false - type: bool - online_prediction_console_logging: - description: - - If true, online prediction nodes send stderr and stdout streams to Stackdriver - Logging. - required: false - type: bool - labels: - description: - - One or more labels that you can add, to organize your models. - required: false - type: dict - project: - description: - - The Google Cloud Platform project to use. - type: str - auth_kind: - description: - - The type of credential used. - type: str - required: true - choices: - - application - - machineaccount - - serviceaccount - - accesstoken - service_account_contents: - description: - - The contents of a Service Account JSON file, either in a dictionary or as a - JSON string that represents it. - type: jsonarg - service_account_file: - description: - - The path of a Service Account JSON file if serviceaccount is selected as type. - type: path - service_account_email: - description: - - An optional service account email address if machineaccount is selected and - the user does not wish to use the default email. - type: str - access_token: - description: - - An OAuth2 access token if credential type is accesstoken. - type: str - scopes: - description: - - Array of scopes to be used - type: list - elements: str - env_type: - description: - - Specifies which Ansible environment you're running this module within. - - This should not be set unless you know what you're doing. - - This only alters the User Agent string for any API requests. - type: str -notes: -- 'API Reference: U(https://cloud.google.com/ai-platform/prediction/docs/reference/rest/v1/projects.models)' -- 'Official Documentation: U(https://cloud.google.com/ai-platform/prediction/docs/deploying-models)' -- for authentication, you can set service_account_file using the C(GCP_SERVICE_ACCOUNT_FILE) - env variable. -- for authentication, you can set service_account_contents using the C(GCP_SERVICE_ACCOUNT_CONTENTS) - env variable. -- For authentication, you can set service_account_email using the C(GCP_SERVICE_ACCOUNT_EMAIL) - env variable. -- For authentication, you can set access_token using the C(GCP_ACCESS_TOKEN) - env variable. -- For authentication, you can set auth_kind using the C(GCP_AUTH_KIND) env variable. -- For authentication, you can set scopes using the C(GCP_SCOPES) env variable. -- Environment variables values will only be used if the playbook values are not set. -- The I(service_account_email) and I(service_account_file) options are mutually exclusive. -''' - -EXAMPLES = ''' -- name: create a model - google.cloud.gcp_mlengine_model: - name: "{{ resource_name | replace('-', '_') }}" - description: My model - regions: - - us-central1 - project: test_project - auth_kind: serviceaccount - service_account_file: "/tmp/auth.pem" - state: present -''' - -RETURN = ''' -name: - description: - - The name specified for the model. - returned: success - type: str -description: - description: - - The description specified for the model when it was created. - returned: success - type: str -defaultVersion: - description: - - The default version of the model. This version will be used to handle prediction - requests that do not specify a version. - returned: success - type: complex - contains: - name: - description: - - The name specified for the version when it was created. - returned: success - type: str -regions: - description: - - The list of regions where the model is going to be deployed. - - Currently only one region per model is supported . - returned: success - type: list -onlinePredictionLogging: - description: - - If true, online prediction access logs are sent to StackDriver Logging. - returned: success - type: bool -onlinePredictionConsoleLogging: - description: - - If true, online prediction nodes send stderr and stdout streams to Stackdriver - Logging. - returned: success - type: bool -labels: - description: - - One or more labels that you can add, to organize your models. - returned: success - type: dict -''' - -################################################################################ -# Imports -################################################################################ - -from ansible_collections.google.cloud.plugins.module_utils.gcp_utils import ( - navigate_hash, - GcpSession, - GcpModule, - GcpRequest, - remove_nones_from_dict, -) -import json -import time - -################################################################################ -# Main -################################################################################ - - -def main(): - """Main function""" - - module = GcpModule( - argument_spec=dict( - state=dict(default='present', choices=['present', 'absent'], type='str'), - name=dict(required=True, type='str'), - description=dict(type='str'), - default_version=dict(type='dict', options=dict(name=dict(required=True, type='str'))), - regions=dict(type='list', elements='str'), - online_prediction_logging=dict(type='bool'), - online_prediction_console_logging=dict(type='bool'), - labels=dict(type='dict'), - ) - ) - - if not module.params['scopes']: - module.params['scopes'] = ['https://www.googleapis.com/auth/cloud-platform'] - - state = module.params['state'] - - fetch = fetch_resource(module, self_link(module)) - changed = False - - if fetch: - if state == 'present': - if is_different(module, fetch): - update(module, self_link(module)) - fetch = fetch_resource(module, self_link(module)) - changed = True - else: - delete(module, self_link(module)) - fetch = {} - changed = True - else: - if state == 'present': - fetch = create(module, collection(module)) - changed = True - else: - fetch = {} - - fetch.update({'changed': changed}) - - module.exit_json(**fetch) - - -def create(module, link): - auth = GcpSession(module, 'mlengine') - return return_if_object(module, auth.post(link, resource_to_request(module))) - - -def update(module, link): - delete(module, self_link(module)) - create(module, collection(module)) - - -def delete(module, link): - auth = GcpSession(module, 'mlengine') - return wait_for_operation(module, auth.delete(link)) - - -def resource_to_request(module): - request = { - u'name': module.params.get('name'), - u'description': module.params.get('description'), - u'defaultVersion': ModelDefaultversion(module.params.get('default_version', {}), module).to_request(), - u'regions': module.params.get('regions'), - u'onlinePredictionLogging': module.params.get('online_prediction_logging'), - u'onlinePredictionConsoleLogging': module.params.get('online_prediction_console_logging'), - u'labels': module.params.get('labels'), - } - return_vals = {} - for k, v in request.items(): - if v or v is False: - return_vals[k] = v - - return return_vals - - -def fetch_resource(module, link, allow_not_found=True): - auth = GcpSession(module, 'mlengine') - return return_if_object(module, auth.get(link), allow_not_found) - - -def self_link(module): - return "https://ml.googleapis.com/v1/projects/{project}/models/{name}".format(**module.params) - - -def collection(module): - return "https://ml.googleapis.com/v1/projects/{project}/models".format(**module.params) - - -def return_if_object(module, response, allow_not_found=False): - # If not found, return nothing. - if allow_not_found and response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError): - module.fail_json(msg="Invalid JSON response with error: %s" % response.text) - - result = decode_response(result, module) - - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - - return result - - -def is_different(module, response): - request = resource_to_request(module) - response = response_to_hash(module, response) - request = decode_response(request, module) - - # Remove all output-only from response. - response_vals = {} - for k, v in response.items(): - if k in request: - response_vals[k] = v - - request_vals = {} - for k, v in request.items(): - if k in response: - request_vals[k] = v - - return GcpRequest(request_vals) != GcpRequest(response_vals) - - -# Remove unnecessary properties from the response. -# This is for doing comparisons with Ansible's current parameters. -def response_to_hash(module, response): - return { - u'name': response.get(u'name'), - u'description': response.get(u'description'), - u'defaultVersion': ModelDefaultversion(response.get(u'defaultVersion', {}), module).from_response(), - u'regions': response.get(u'regions'), - u'onlinePredictionLogging': response.get(u'onlinePredictionLogging'), - u'onlinePredictionConsoleLogging': response.get(u'onlinePredictionConsoleLogging'), - u'labels': response.get(u'labels'), - } - - -def async_op_url(module, extra_data=None): - if extra_data is None: - extra_data = {} - url = "https://ml.googleapis.com/v1/{op_id}" - combined = extra_data.copy() - combined.update(module.params) - return url.format(**combined) - - -def wait_for_operation(module, response): - op_result = return_if_object(module, response) - if op_result is None: - return {} - status = navigate_hash(op_result, ['done']) - wait_done = wait_for_completion(status, op_result, module) - raise_if_errors(wait_done, ['error'], module) - return navigate_hash(wait_done, ['response']) - - -def wait_for_completion(status, op_result, module): - op_id = navigate_hash(op_result, ['name']) - op_uri = async_op_url(module, {'op_id': op_id}) - while not status: - raise_if_errors(op_result, ['error'], module) - time.sleep(1.0) - op_result = fetch_resource(module, op_uri, False) - status = navigate_hash(op_result, ['done']) - return op_result - - -def raise_if_errors(response, err_path, module): - errors = navigate_hash(response, err_path) - if errors is not None: - module.fail_json(msg=errors) - - -# Short names are given (and expected) by the API -# but are returned as full names. -def decode_response(response, module): - if 'name' in response and 'metadata' not in response: - response['name'] = response['name'].split('/')[-1] - return response - - -class ModelDefaultversion(object): - def __init__(self, request, module): - self.module = module - if request: - self.request = request - else: - self.request = {} - - def to_request(self): - return remove_nones_from_dict({u'name': self.request.get('name')}) - - def from_response(self): - return remove_nones_from_dict({u'name': self.request.get(u'name')}) - - -if __name__ == '__main__': - main() diff --git a/plugins/modules/gcp_mlengine_model_info.py b/plugins/modules/gcp_mlengine_model_info.py deleted file mode 100644 index 332892720..000000000 --- a/plugins/modules/gcp_mlengine_model_info.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2017 Google -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** Type: MMv1 *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -################################################################################ -# Documentation -################################################################################ - -ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ["preview"], 'supported_by': 'community'} - -DOCUMENTATION = ''' ---- -module: gcp_mlengine_model_info -description: -- Gather info for GCP Model -short_description: Gather info for GCP Model -author: Google Inc. (@googlecloudplatform) -requirements: -- python >= 2.6 -- requests >= 2.18.4 -- google-auth >= 1.3.0 -options: - project: - description: - - The Google Cloud Platform project to use. - type: str - auth_kind: - description: - - The type of credential used. - type: str - required: true - choices: - - application - - machineaccount - - serviceaccount - - accesstoken - service_account_contents: - description: - - The contents of a Service Account JSON file, either in a dictionary or as a - JSON string that represents it. - type: jsonarg - service_account_file: - description: - - The path of a Service Account JSON file if serviceaccount is selected as type. - type: path - service_account_email: - description: - - An optional service account email address if machineaccount is selected and - the user does not wish to use the default email. - type: str - access_token: - description: - - An OAuth2 access token if credential type is accesstoken. - type: str - scopes: - description: - - Array of scopes to be used - type: list - elements: str - env_type: - description: - - Specifies which Ansible environment you're running this module within. - - This should not be set unless you know what you're doing. - - This only alters the User Agent string for any API requests. - type: str -notes: -- for authentication, you can set service_account_file using the C(GCP_SERVICE_ACCOUNT_FILE) - env variable. -- for authentication, you can set service_account_contents using the C(GCP_SERVICE_ACCOUNT_CONTENTS) - env variable. -- For authentication, you can set service_account_email using the C(GCP_SERVICE_ACCOUNT_EMAIL) - env variable. -- For authentication, you can set access_token using the C(GCP_ACCESS_TOKEN) - env variable. -- For authentication, you can set auth_kind using the C(GCP_AUTH_KIND) env variable. -- For authentication, you can set scopes using the C(GCP_SCOPES) env variable. -- Environment variables values will only be used if the playbook values are not set. -- The I(service_account_email) and I(service_account_file) options are mutually exclusive. -''' - -EXAMPLES = ''' -- name: get info on a model - gcp_mlengine_model_info: - project: test_project - auth_kind: serviceaccount - service_account_file: "/tmp/auth.pem" -''' - -RETURN = ''' -resources: - description: List of resources - returned: always - type: complex - contains: - name: - description: - - The name specified for the model. - returned: success - type: str - description: - description: - - The description specified for the model when it was created. - returned: success - type: str - defaultVersion: - description: - - The default version of the model. This version will be used to handle prediction - requests that do not specify a version. - returned: success - type: complex - contains: - name: - description: - - The name specified for the version when it was created. - returned: success - type: str - regions: - description: - - The list of regions where the model is going to be deployed. - - Currently only one region per model is supported . - returned: success - type: list - onlinePredictionLogging: - description: - - If true, online prediction access logs are sent to StackDriver Logging. - returned: success - type: bool - onlinePredictionConsoleLogging: - description: - - If true, online prediction nodes send stderr and stdout streams to Stackdriver - Logging. - returned: success - type: bool - labels: - description: - - One or more labels that you can add, to organize your models. - returned: success - type: dict -''' - -################################################################################ -# Imports -################################################################################ -from ansible_collections.google.cloud.plugins.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule -import json - -################################################################################ -# Main -################################################################################ - - -def main(): - module = GcpModule(argument_spec=dict(), supports_check_mode=True) - - if not module.params['scopes']: - module.params['scopes'] = ['https://www.googleapis.com/auth/cloud-platform'] - - return_value = {'resources': fetch_list(module, collection(module))} - module.exit_json(**return_value) - - -def collection(module): - return "https://ml.googleapis.com/v1/projects/{project}/models".format(**module.params) - - -def fetch_list(module, link): - auth = GcpSession(module, 'mlengine') - return auth.list(link, return_if_object, array_name='models') - - -def return_if_object(module, response): - # If not found, return nothing. - if response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: - module.fail_json(msg="Invalid JSON response with error: %s" % inst) - - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - - return result - - -if __name__ == "__main__": - main() diff --git a/plugins/modules/gcp_mlengine_version.py b/plugins/modules/gcp_mlengine_version.py deleted file mode 100644 index e19fbe764..000000000 --- a/plugins/modules/gcp_mlengine_version.py +++ /dev/null @@ -1,639 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2017 Google -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** Type: MMv1 *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -################################################################################ -# Documentation -################################################################################ - -ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ["preview"], 'supported_by': 'community'} - -DOCUMENTATION = ''' ---- -module: gcp_mlengine_version -description: -- Each version is a trained model deployed in the cloud, ready to handle prediction - requests. A model can have multiple versions . -short_description: Creates a GCP Version -author: Google Inc. (@googlecloudplatform) -requirements: -- python >= 2.6 -- requests >= 2.18.4 -- google-auth >= 1.3.0 -options: - state: - description: - - Whether the given object should exist in GCP - choices: - - present - - absent - default: present - type: str - name: - description: - - The name specified for the version when it was created. - - The version name must be unique within the model it is created in. - required: true - type: str - description: - description: - - The description specified for the version when it was created. - required: false - type: str - deployment_uri: - description: - - The Cloud Storage location of the trained model used to create the version. - required: true - type: str - runtime_version: - description: - - The AI Platform runtime version to use for this deployment. - required: false - type: str - machine_type: - description: - - The type of machine on which to serve the model. Currently only applies to online - prediction service. - - 'Some valid choices include: "mls1-c1-m2", "mls1-c4-m2"' - required: false - type: str - labels: - description: - - One or more labels that you can add, to organize your model versions. - required: false - type: dict - framework: - description: - - The machine learning framework AI Platform uses to train this version of the - model. - - 'Some valid choices include: "FRAMEWORK_UNSPECIFIED", "TENSORFLOW", "SCIKIT_LEARN", - "XGBOOST"' - required: false - type: str - python_version: - description: - - The version of Python used in prediction. If not set, the default version is - '2.7'. Python '3.5' is available when runtimeVersion is set to '1.4' and above. - Python '2.7' works with all supported runtime versions. - - 'Some valid choices include: "2.7", "3.5"' - required: false - type: str - service_account: - description: - - Specifies the service account for resource access control. - required: false - type: str - auto_scaling: - description: - - Automatically scale the number of nodes used to serve the model in response - to increases and decreases in traffic. Care should be taken to ramp up traffic - according to the model's ability to scale or you will start seeing increases - in latency and 429 response codes. - required: false - type: dict - suboptions: - min_nodes: - description: - - The minimum number of nodes to allocate for this mode. - required: false - type: int - manual_scaling: - description: - - Manually select the number of nodes to use for serving the model. You should - generally use autoScaling with an appropriate minNodes instead, but this option - is available if you want more predictable billing. Beware that latency and error - rates will increase if the traffic exceeds that capability of the system to - serve it based on the selected number of nodes. - required: false - type: dict - suboptions: - nodes: - description: - - The number of nodes to allocate for this model. These nodes are always up, - starting from the time the model is deployed. - required: false - type: int - prediction_class: - description: - - The fully qualified name (module_name.class_name) of a class that implements - the Predictor interface described in this reference field. The module containing - this class should be included in a package provided to the packageUris field. - required: false - type: str - model: - description: - - The model that this version belongs to. - - 'This field represents a link to a Model resource in GCP. It can be specified - in two ways. First, you can place a dictionary with key ''name'' and value of - your resource''s name Alternatively, you can add `register: name-of-resource` - to a gcp_mlengine_model task and then set this model field to "{{ name-of-resource - }}"' - required: true - type: dict - is_default: - description: - - If true, this version will be used to handle prediction requests that do not - specify a version. - required: false - type: bool - aliases: - - default - project: - description: - - The Google Cloud Platform project to use. - type: str - auth_kind: - description: - - The type of credential used. - type: str - required: true - choices: - - application - - machineaccount - - serviceaccount - - accesstoken - service_account_contents: - description: - - The contents of a Service Account JSON file, either in a dictionary or as a - JSON string that represents it. - type: jsonarg - service_account_file: - description: - - The path of a Service Account JSON file if serviceaccount is selected as type. - type: path - service_account_email: - description: - - An optional service account email address if machineaccount is selected and - the user does not wish to use the default email. - type: str - access_token: - description: - - An OAuth2 access token if credential type is accesstoken. - type: str - scopes: - description: - - Array of scopes to be used - type: list - elements: str - env_type: - description: - - Specifies which Ansible environment you're running this module within. - - This should not be set unless you know what you're doing. - - This only alters the User Agent string for any API requests. - type: str -''' - -EXAMPLES = ''' -- name: create a model - google.cloud.gcp_mlengine_model: - name: model_version - description: My model - regions: - - us-central1 - online_prediction_logging: 'true' - online_prediction_console_logging: 'true' - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file }}" - state: present - register: model - -- name: create a version - google.cloud.gcp_mlengine_version: - name: "{{ resource_name | replace('-', '_') }}" - model: "{{ model }}" - runtime_version: 1.13 - python_version: 3.5 - is_default: 'true' - deployment_uri: gs://ansible-cloudml-bucket/ - project: test_project - auth_kind: serviceaccount - service_account_file: "/tmp/auth.pem" - state: present -''' - -RETURN = ''' -name: - description: - - The name specified for the version when it was created. - - The version name must be unique within the model it is created in. - returned: success - type: str -description: - description: - - The description specified for the version when it was created. - returned: success - type: str -deploymentUri: - description: - - The Cloud Storage location of the trained model used to create the version. - returned: success - type: str -createTime: - description: - - The time the version was created. - returned: success - type: str -lastUseTime: - description: - - The time the version was last used for prediction. - returned: success - type: str -runtimeVersion: - description: - - The AI Platform runtime version to use for this deployment. - returned: success - type: str -machineType: - description: - - The type of machine on which to serve the model. Currently only applies to online - prediction service. - returned: success - type: str -state: - description: - - The state of a version. - returned: success - type: str -errorMessage: - description: - - The details of a failure or cancellation. - returned: success - type: str -packageUris: - description: - - Cloud Storage paths (gs://…) of packages for custom prediction routines or scikit-learn - pipelines with custom code. - returned: success - type: list -labels: - description: - - One or more labels that you can add, to organize your model versions. - returned: success - type: dict -framework: - description: - - The machine learning framework AI Platform uses to train this version of the model. - returned: success - type: str -pythonVersion: - description: - - The version of Python used in prediction. If not set, the default version is '2.7'. - Python '3.5' is available when runtimeVersion is set to '1.4' and above. Python - '2.7' works with all supported runtime versions. - returned: success - type: str -serviceAccount: - description: - - Specifies the service account for resource access control. - returned: success - type: str -autoScaling: - description: - - Automatically scale the number of nodes used to serve the model in response to - increases and decreases in traffic. Care should be taken to ramp up traffic according - to the model's ability to scale or you will start seeing increases in latency - and 429 response codes. - returned: success - type: complex - contains: - minNodes: - description: - - The minimum number of nodes to allocate for this mode. - returned: success - type: int -manualScaling: - description: - - Manually select the number of nodes to use for serving the model. You should generally - use autoScaling with an appropriate minNodes instead, but this option is available - if you want more predictable billing. Beware that latency and error rates will - increase if the traffic exceeds that capability of the system to serve it based - on the selected number of nodes. - returned: success - type: complex - contains: - nodes: - description: - - The number of nodes to allocate for this model. These nodes are always up, - starting from the time the model is deployed. - returned: success - type: int -predictionClass: - description: - - The fully qualified name (module_name.class_name) of a class that implements the - Predictor interface described in this reference field. The module containing this - class should be included in a package provided to the packageUris field. - returned: success - type: str -model: - description: - - The model that this version belongs to. - returned: success - type: dict -isDefault: - description: - - If true, this version will be used to handle prediction requests that do not specify - a version. - returned: success - type: bool -''' - -################################################################################ -# Imports -################################################################################ - -from ansible_collections.google.cloud.plugins.module_utils.gcp_utils import ( - navigate_hash, - GcpSession, - GcpModule, - GcpRequest, - remove_nones_from_dict, - replace_resource_dict, -) -import json -import time - -################################################################################ -# Main -################################################################################ - - -def main(): - """Main function""" - - module = GcpModule( - argument_spec=dict( - state=dict(default='present', choices=['present', 'absent'], type='str'), - name=dict(required=True, type='str'), - description=dict(type='str'), - deployment_uri=dict(required=True, type='str'), - runtime_version=dict(type='str'), - machine_type=dict(type='str'), - labels=dict(type='dict'), - framework=dict(type='str'), - python_version=dict(type='str'), - service_account=dict(type='str'), - auto_scaling=dict(type='dict', options=dict(min_nodes=dict(type='int'))), - manual_scaling=dict(type='dict', options=dict(nodes=dict(type='int'))), - prediction_class=dict(type='str'), - model=dict(required=True, type='dict'), - is_default=dict(type='bool', aliases=['default']), - ), - mutually_exclusive=[['auto_scaling', 'manual_scaling']], - ) - - if not module.params['scopes']: - module.params['scopes'] = ['https://www.googleapis.com/auth/cloud-platform'] - - state = module.params['state'] - - fetch = fetch_resource(module, self_link(module)) - changed = False - - if fetch: - if state == 'present': - if is_different(module, fetch): - update(module, self_link(module)) - fetch = fetch_resource(module, self_link(module)) - changed = True - else: - delete(module, self_link(module)) - fetch = {} - changed = True - else: - if state == 'present': - fetch = create(module, collection(module)) - if module.params.get('is_default') is True: - set_default(module) - changed = True - else: - fetch = {} - - fetch.update({'changed': changed}) - - module.exit_json(**fetch) - - -def create(module, link): - auth = GcpSession(module, 'mlengine') - return wait_for_operation(module, auth.post(link, resource_to_request(module))) - - -def update(module, link): - if module.params.get('is_default') is True: - set_default(module) - - -def delete(module, link): - auth = GcpSession(module, 'mlengine') - return wait_for_operation(module, auth.delete(link)) - - -def resource_to_request(module): - request = { - u'name': module.params.get('name'), - u'description': module.params.get('description'), - u'deploymentUri': module.params.get('deployment_uri'), - u'runtimeVersion': module.params.get('runtime_version'), - u'machineType': module.params.get('machine_type'), - u'labels': module.params.get('labels'), - u'framework': module.params.get('framework'), - u'pythonVersion': module.params.get('python_version'), - u'serviceAccount': module.params.get('service_account'), - u'autoScaling': VersionAutoscaling(module.params.get('auto_scaling', {}), module).to_request(), - u'manualScaling': VersionManualscaling(module.params.get('manual_scaling', {}), module).to_request(), - u'predictionClass': module.params.get('prediction_class'), - } - return_vals = {} - for k, v in request.items(): - if v or v is False: - return_vals[k] = v - - return return_vals - - -def fetch_resource(module, link, allow_not_found=True): - auth = GcpSession(module, 'mlengine') - return return_if_object(module, auth.get(link), allow_not_found) - - -def self_link(module): - res = {'project': module.params['project'], 'model': replace_resource_dict(module.params['model'], 'name'), 'name': module.params['name']} - return "https://ml.googleapis.com/v1/projects/{project}/models/{model}/versions/{name}".format(**res) - - -def collection(module): - res = {'project': module.params['project'], 'model': replace_resource_dict(module.params['model'], 'name')} - return "https://ml.googleapis.com/v1/projects/{project}/models/{model}/versions".format(**res) - - -def return_if_object(module, response, allow_not_found=False): - # If not found, return nothing. - if allow_not_found and response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError): - module.fail_json(msg="Invalid JSON response with error: %s" % response.text) - - result = decode_response(result, module) - - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - - return result - - -def is_different(module, response): - request = resource_to_request(module) - response = response_to_hash(module, response) - request = decode_response(request, module) - - # Remove all output-only from response. - response_vals = {} - for k, v in response.items(): - if k in request: - response_vals[k] = v - - request_vals = {} - for k, v in request.items(): - if k in response: - request_vals[k] = v - - return GcpRequest(request_vals) != GcpRequest(response_vals) - - -# Remove unnecessary properties from the response. -# This is for doing comparisons with Ansible's current parameters. -def response_to_hash(module, response): - return { - u'name': response.get(u'name'), - u'description': response.get(u'description'), - u'deploymentUri': response.get(u'deploymentUri'), - u'createTime': response.get(u'createTime'), - u'lastUseTime': response.get(u'lastUseTime'), - u'runtimeVersion': response.get(u'runtimeVersion'), - u'machineType': response.get(u'machineType'), - u'state': response.get(u'state'), - u'errorMessage': response.get(u'errorMessage'), - u'packageUris': response.get(u'packageUris'), - u'labels': response.get(u'labels'), - u'framework': response.get(u'framework'), - u'pythonVersion': response.get(u'pythonVersion'), - u'serviceAccount': response.get(u'serviceAccount'), - u'autoScaling': VersionAutoscaling(response.get(u'autoScaling', {}), module).from_response(), - u'manualScaling': VersionManualscaling(response.get(u'manualScaling', {}), module).from_response(), - u'predictionClass': response.get(u'predictionClass'), - } - - -def async_op_url(module, extra_data=None): - if extra_data is None: - extra_data = {} - url = "https://ml.googleapis.com/v1/{op_id}" - combined = extra_data.copy() - combined.update(module.params) - return url.format(**combined) - - -def wait_for_operation(module, response): - op_result = return_if_object(module, response) - if op_result is None: - return {} - status = navigate_hash(op_result, ['done']) - wait_done = wait_for_completion(status, op_result, module) - raise_if_errors(wait_done, ['error'], module) - return navigate_hash(wait_done, ['response']) - - -def wait_for_completion(status, op_result, module): - op_id = navigate_hash(op_result, ['name']) - op_uri = async_op_url(module, {'op_id': op_id}) - while not status: - raise_if_errors(op_result, ['error'], module) - time.sleep(1.0) - op_result = fetch_resource(module, op_uri, False) - status = navigate_hash(op_result, ['done']) - return op_result - - -def raise_if_errors(response, err_path, module): - errors = navigate_hash(response, err_path) - if errors is not None: - module.fail_json(msg=errors) - - -# Short names are given (and expected) by the API -# but are returned as full names. -def decode_response(response, module): - if 'name' in response and 'metadata' not in response: - response['name'] = response['name'].split('/')[-1] - return response - - -# Sets this version as default. -def set_default(module): - res = {'project': module.params['project'], 'model': replace_resource_dict(module.params['model'], 'name'), 'name': module.params['name']} - link = "https://ml.googleapis.com/v1/projects/{project}/models/{model}/versions/{name}:setDefault".format(**res) - - auth = GcpSession(module, 'mlengine') - return_if_object(module, auth.post(link)) - - -class VersionAutoscaling(object): - def __init__(self, request, module): - self.module = module - if request: - self.request = request - else: - self.request = {} - - def to_request(self): - return remove_nones_from_dict({u'minNodes': self.request.get('min_nodes')}) - - def from_response(self): - return remove_nones_from_dict({u'minNodes': self.request.get(u'minNodes')}) - - -class VersionManualscaling(object): - def __init__(self, request, module): - self.module = module - if request: - self.request = request - else: - self.request = {} - - def to_request(self): - return remove_nones_from_dict({u'nodes': self.request.get('nodes')}) - - def from_response(self): - return remove_nones_from_dict({u'nodes': self.request.get(u'nodes')}) - - -if __name__ == '__main__': - main() diff --git a/plugins/modules/gcp_mlengine_version_info.py b/plugins/modules/gcp_mlengine_version_info.py deleted file mode 100644 index 04523a750..000000000 --- a/plugins/modules/gcp_mlengine_version_info.py +++ /dev/null @@ -1,304 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2017 Google -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** Type: MMv1 *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -################################################################################ -# Documentation -################################################################################ - -ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ["preview"], 'supported_by': 'community'} - -DOCUMENTATION = ''' ---- -module: gcp_mlengine_version_info -description: -- Gather info for GCP Version -short_description: Gather info for GCP Version -author: Google Inc. (@googlecloudplatform) -requirements: -- python >= 2.6 -- requests >= 2.18.4 -- google-auth >= 1.3.0 -options: - model: - description: - - The model that this version belongs to. - - 'This field represents a link to a Model resource in GCP. It can be specified - in two ways. First, you can place a dictionary with key ''name'' and value of - your resource''s name Alternatively, you can add `register: name-of-resource` - to a gcp_mlengine_model task and then set this model field to "{{ name-of-resource - }}"' - required: true - type: dict - project: - description: - - The Google Cloud Platform project to use. - type: str - auth_kind: - description: - - The type of credential used. - type: str - required: true - choices: - - application - - machineaccount - - serviceaccount - - accesstoken - service_account_contents: - description: - - The contents of a Service Account JSON file, either in a dictionary or as a - JSON string that represents it. - type: jsonarg - service_account_file: - description: - - The path of a Service Account JSON file if serviceaccount is selected as type. - type: path - service_account_email: - description: - - An optional service account email address if machineaccount is selected and - the user does not wish to use the default email. - type: str - access_token: - description: - - An OAuth2 access token if credential type is accesstoken. - type: str - scopes: - description: - - Array of scopes to be used - type: list - elements: str - env_type: - description: - - Specifies which Ansible environment you're running this module within. - - This should not be set unless you know what you're doing. - - This only alters the User Agent string for any API requests. - type: str -notes: -- for authentication, you can set service_account_file using the C(GCP_SERVICE_ACCOUNT_FILE) - env variable. -- for authentication, you can set service_account_contents using the C(GCP_SERVICE_ACCOUNT_CONTENTS) - env variable. -- For authentication, you can set service_account_email using the C(GCP_SERVICE_ACCOUNT_EMAIL) - env variable. -- For authentication, you can set access_token using the C(GCP_ACCESS_TOKEN) - env variable. -- For authentication, you can set auth_kind using the C(GCP_AUTH_KIND) env variable. -- For authentication, you can set scopes using the C(GCP_SCOPES) env variable. -- Environment variables values will only be used if the playbook values are not set. -- The I(service_account_email) and I(service_account_file) options are mutually exclusive. -''' - -EXAMPLES = ''' -- name: get info on a version - gcp_mlengine_version_info: - model: "{{ model }}" - project: test_project - auth_kind: serviceaccount - service_account_file: "/tmp/auth.pem" -''' - -RETURN = ''' -resources: - description: List of resources - returned: always - type: complex - contains: - name: - description: - - The name specified for the version when it was created. - - The version name must be unique within the model it is created in. - returned: success - type: str - description: - description: - - The description specified for the version when it was created. - returned: success - type: str - deploymentUri: - description: - - The Cloud Storage location of the trained model used to create the version. - returned: success - type: str - createTime: - description: - - The time the version was created. - returned: success - type: str - lastUseTime: - description: - - The time the version was last used for prediction. - returned: success - type: str - runtimeVersion: - description: - - The AI Platform runtime version to use for this deployment. - returned: success - type: str - machineType: - description: - - The type of machine on which to serve the model. Currently only applies to - online prediction service. - returned: success - type: str - state: - description: - - The state of a version. - returned: success - type: str - errorMessage: - description: - - The details of a failure or cancellation. - returned: success - type: str - packageUris: - description: - - Cloud Storage paths (gs://…) of packages for custom prediction routines or - scikit-learn pipelines with custom code. - returned: success - type: list - labels: - description: - - One or more labels that you can add, to organize your model versions. - returned: success - type: dict - framework: - description: - - The machine learning framework AI Platform uses to train this version of the - model. - returned: success - type: str - pythonVersion: - description: - - The version of Python used in prediction. If not set, the default version - is '2.7'. Python '3.5' is available when runtimeVersion is set to '1.4' and - above. Python '2.7' works with all supported runtime versions. - returned: success - type: str - serviceAccount: - description: - - Specifies the service account for resource access control. - returned: success - type: str - autoScaling: - description: - - Automatically scale the number of nodes used to serve the model in response - to increases and decreases in traffic. Care should be taken to ramp up traffic - according to the model's ability to scale or you will start seeing increases - in latency and 429 response codes. - returned: success - type: complex - contains: - minNodes: - description: - - The minimum number of nodes to allocate for this mode. - returned: success - type: int - manualScaling: - description: - - Manually select the number of nodes to use for serving the model. You should - generally use autoScaling with an appropriate minNodes instead, but this option - is available if you want more predictable billing. Beware that latency and - error rates will increase if the traffic exceeds that capability of the system - to serve it based on the selected number of nodes. - returned: success - type: complex - contains: - nodes: - description: - - The number of nodes to allocate for this model. These nodes are always - up, starting from the time the model is deployed. - returned: success - type: int - predictionClass: - description: - - The fully qualified name (module_name.class_name) of a class that implements - the Predictor interface described in this reference field. The module containing - this class should be included in a package provided to the packageUris field. - returned: success - type: str - model: - description: - - The model that this version belongs to. - returned: success - type: dict - isDefault: - description: - - If true, this version will be used to handle prediction requests that do not - specify a version. - returned: success - type: bool -''' - -################################################################################ -# Imports -################################################################################ -from ansible_collections.google.cloud.plugins.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, replace_resource_dict -import json - -################################################################################ -# Main -################################################################################ - - -def main(): - module = GcpModule(argument_spec=dict(model=dict(required=True, type='dict')), supports_check_mode=True) - - if not module.params['scopes']: - module.params['scopes'] = ['https://www.googleapis.com/auth/cloud-platform'] - - return_value = {'resources': fetch_list(module, collection(module))} - module.exit_json(**return_value) - - -def collection(module): - res = {'project': module.params['project'], 'model': replace_resource_dict(module.params['model'], 'name')} - return "https://ml.googleapis.com/v1/projects/{project}/models/{model}/versions".format(**res) - - -def fetch_list(module, link): - auth = GcpSession(module, 'mlengine') - return auth.list(link, return_if_object, array_name='versions') - - -def return_if_object(module, response): - # If not found, return nothing. - if response.status_code == 404: - return None - - # If no content, return nothing. - if response.status_code == 204: - return None - - try: - module.raise_for_status(response) - result = response.json() - except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: - module.fail_json(msg="Invalid JSON response with error: %s" % inst) - - if navigate_hash(result, ['error', 'errors']): - module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) - - return result - - -if __name__ == "__main__": - main() diff --git a/tests/integration/targets/gcp_mlengine_model/aliases b/tests/integration/targets/gcp_mlengine_model/aliases deleted file mode 100644 index 0e4419e32..000000000 --- a/tests/integration/targets/gcp_mlengine_model/aliases +++ /dev/null @@ -1 +0,0 @@ -cloud/gcp \ No newline at end of file diff --git a/tests/integration/targets/gcp_mlengine_model/defaults/main.yml b/tests/integration/targets/gcp_mlengine_model/defaults/main.yml deleted file mode 100644 index ba66644fc..000000000 --- a/tests/integration/targets/gcp_mlengine_model/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -resource_name: "{{ resource_prefix }}" diff --git a/tests/integration/targets/gcp_mlengine_model/meta/main.yml b/tests/integration/targets/gcp_mlengine_model/meta/main.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/integration/targets/gcp_mlengine_model/tasks/autogen.yml b/tests/integration/targets/gcp_mlengine_model/tasks/autogen.yml deleted file mode 100644 index 0e7f01a0e..000000000 --- a/tests/integration/targets/gcp_mlengine_model/tasks/autogen.yml +++ /dev/null @@ -1,113 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** Type: MMv1 *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- -# Pre-test setup -- name: Delete a model - google.cloud.gcp_mlengine_model: - name: "{{ resource_name | replace('-', '_') }}" - description: My model - regions: - - us-central1 - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: absent -# ---------------------------------------------------------- -- name: Create a model - google.cloud.gcp_mlengine_model: - name: "{{ resource_name | replace('-', '_') }}" - description: My model - regions: - - us-central1 - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: present - register: result -- name: Assert changed is true - ansible.builtin.assert: - that: - - result.changed == true -- name: Verify that model was created - google.cloud.gcp_mlengine_model_info: - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - scopes: - - https://www.googleapis.com/auth/cloud-platform - register: results -- name: Verify that command succeeded - ansible.builtin.assert: - that: - - results['resources'] | map(attribute='name') | select("match", ".*{{ resource_name | replace('-', '_') }}.*") | list | length == 1 -# ---------------------------------------------------------------------------- -- name: Create a model that already exists - google.cloud.gcp_mlengine_model: - name: "{{ resource_name | replace('-', '_') }}" - description: My model - regions: - - us-central1 - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: present - register: result -- name: Assert changed is false - ansible.builtin.assert: - that: - - result.changed == false -# ---------------------------------------------------------- -- name: Delete a model - google.cloud.gcp_mlengine_model: - name: "{{ resource_name | replace('-', '_') }}" - description: My model - regions: - - us-central1 - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: absent - register: result -- name: Assert changed is true - ansible.builtin.assert: - that: - - result.changed == true -- name: Verify that model was deleted - google.cloud.gcp_mlengine_model_info: - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - scopes: - - https://www.googleapis.com/auth/cloud-platform - register: results -- name: Verify that command succeeded - ansible.builtin.assert: - that: - - results['resources'] | map(attribute='name') | select("match", ".*{{ resource_name | replace('-', '_') }}.*") | list | length == 0 -# ---------------------------------------------------------------------------- -- name: Delete a model that does not exist - google.cloud.gcp_mlengine_model: - name: "{{ resource_name | replace('-', '_') }}" - description: My model - regions: - - us-central1 - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: absent - register: result -- name: Assert changed is false - ansible.builtin.assert: - that: - - result.changed == false diff --git a/tests/integration/targets/gcp_mlengine_model/tasks/main.yml b/tests/integration/targets/gcp_mlengine_model/tasks/main.yml deleted file mode 100644 index fe47378c2..000000000 --- a/tests/integration/targets/gcp_mlengine_model/tasks/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -- name: Generated tests - ansible.builtin.include_tasks: autogen.yml diff --git a/tests/integration/targets/gcp_mlengine_version/aliases b/tests/integration/targets/gcp_mlengine_version/aliases deleted file mode 100644 index ff7eb2d4e..000000000 --- a/tests/integration/targets/gcp_mlengine_version/aliases +++ /dev/null @@ -1,2 +0,0 @@ -cloud/gcp -unsupported \ No newline at end of file diff --git a/tests/integration/targets/gcp_mlengine_version/defaults/main.yml b/tests/integration/targets/gcp_mlengine_version/defaults/main.yml deleted file mode 100644 index ba66644fc..000000000 --- a/tests/integration/targets/gcp_mlengine_version/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -resource_name: "{{ resource_prefix }}" diff --git a/tests/integration/targets/gcp_mlengine_version/meta/main.yml b/tests/integration/targets/gcp_mlengine_version/meta/main.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/integration/targets/gcp_mlengine_version/tasks/autogen.yml b/tests/integration/targets/gcp_mlengine_version/tasks/autogen.yml deleted file mode 100644 index d97aa73c4..000000000 --- a/tests/integration/targets/gcp_mlengine_version/tasks/autogen.yml +++ /dev/null @@ -1,155 +0,0 @@ ---- -# ---------------------------------------------------------------------------- -# -# *** AUTO GENERATED CODE *** Type: MMv1 *** -# -# ---------------------------------------------------------------------------- -# -# This file is automatically generated by Magic Modules and manual -# changes will be clobbered when the file is regenerated. -# -# Please read more about how to change this file at -# https://www.github.com/GoogleCloudPlatform/magic-modules -# -# ---------------------------------------------------------------------------- -# Pre-test setup -- name: Create a model - google.cloud.gcp_mlengine_model: - name: model_version - description: My model - regions: - - us-central1 - online_prediction_logging: "true" - online_prediction_console_logging: "true" - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: present - register: model -- name: Delete a version - google.cloud.gcp_mlengine_version: - name: "{{ resource_name | replace('-', '_') }}" - model: "{{ model }}" - runtime_version: 1.13 - python_version: 3.5 - is_default: "true" - deployment_uri: gs://ansible-cloudml-bucket/ - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: absent -# ---------------------------------------------------------- -- name: Create a version - google.cloud.gcp_mlengine_version: - name: "{{ resource_name | replace('-', '_') }}" - model: "{{ model }}" - runtime_version: 1.13 - python_version: 3.5 - is_default: "true" - deployment_uri: gs://ansible-cloudml-bucket/ - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: present - register: result -- name: Assert changed is true - ansible.builtin.assert: - that: - - result.changed == true -- name: Verify that version was created - google.cloud.gcp_mlengine_version_info: - model: "{{ model }}" - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - scopes: - - https://www.googleapis.com/auth/cloud-platform - register: results -- name: Verify that command succeeded - ansible.builtin.assert: - that: - - results['resources'] | map(attribute='name') | select("match", ".*{{ resource_name | replace('-', '_') }}.*") | list | length == 1 -# ---------------------------------------------------------------------------- -- name: Create a version that already exists - google.cloud.gcp_mlengine_version: - name: "{{ resource_name | replace('-', '_') }}" - model: "{{ model }}" - runtime_version: 1.13 - python_version: 3.5 - is_default: "true" - deployment_uri: gs://ansible-cloudml-bucket/ - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: present - register: result -- name: Assert changed is false - ansible.builtin.assert: - that: - - result.changed == false -# ---------------------------------------------------------- -- name: Delete a version - google.cloud.gcp_mlengine_version: - name: "{{ resource_name | replace('-', '_') }}" - model: "{{ model }}" - runtime_version: 1.13 - python_version: 3.5 - is_default: "true" - deployment_uri: gs://ansible-cloudml-bucket/ - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: absent - register: result -- name: Assert changed is true - ansible.builtin.assert: - that: - - result.changed == true -- name: Verify that version was deleted - google.cloud.gcp_mlengine_version_info: - model: "{{ model }}" - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - scopes: - - https://www.googleapis.com/auth/cloud-platform - register: results -- name: Verify that command succeeded - ansible.builtin.assert: - that: - - results['resources'] | map(attribute='name') | select("match", ".*{{ resource_name | replace('-', '_') }}.*") | list | length == 0 -# ---------------------------------------------------------------------------- -- name: Delete a version that does not exist - google.cloud.gcp_mlengine_version: - name: "{{ resource_name | replace('-', '_') }}" - model: "{{ model }}" - runtime_version: 1.13 - python_version: 3.5 - is_default: "true" - deployment_uri: gs://ansible-cloudml-bucket/ - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: absent - register: result -- name: Assert changed is false - ansible.builtin.assert: - that: - - result.changed == false -# --------------------------------------------------------- -# Post-test teardown -# If errors happen, don't crash the playbook! -- name: Delete a model - google.cloud.gcp_mlengine_model: - name: model_version - description: My model - regions: - - us-central1 - online_prediction_logging: "true" - online_prediction_console_logging: "true" - project: "{{ gcp_project }}" - auth_kind: "{{ gcp_cred_kind }}" - service_account_file: "{{ gcp_cred_file | default(omit) }}" - state: absent - register: model - ignore_errors: true diff --git a/tests/integration/targets/gcp_mlengine_version/tasks/main.yml b/tests/integration/targets/gcp_mlengine_version/tasks/main.yml deleted file mode 100644 index fe47378c2..000000000 --- a/tests/integration/targets/gcp_mlengine_version/tasks/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -- name: Generated tests - ansible.builtin.include_tasks: autogen.yml