summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/cloud/google/gcp_compute_instance_template.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/modules/cloud/google/gcp_compute_instance_template.py')
-rw-r--r--lib/ansible/modules/cloud/google/gcp_compute_instance_template.py1661
1 files changed, 0 insertions, 1661 deletions
diff --git a/lib/ansible/modules/cloud/google/gcp_compute_instance_template.py b/lib/ansible/modules/cloud/google/gcp_compute_instance_template.py
deleted file mode 100644
index eaf7c9baac..0000000000
--- a/lib/ansible/modules/cloud/google/gcp_compute_instance_template.py
+++ /dev/null
@@ -1,1661 +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 *** AUTO GENERATED CODE ***
-#
-# ----------------------------------------------------------------------------
-#
-# 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_compute_instance_template
-description:
-- Defines an Instance Template resource that provides configuration settings for your
- virtual machine instances. Instance templates are not tied to the lifetime of an
- instance and can be used and reused as to deploy virtual machines. You can also
- use different templates to create different virtual machine configurations. Instance
- templates are required when you create a managed instance group.
-- 'Tip: Disks should be set to autoDelete=true so that leftover disks are not left
- behind on machine deletion.'
-short_description: Creates a GCP InstanceTemplate
-version_added: '2.6'
-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
- description:
- description:
- - An optional description of this resource. Provide this property when you create
- the resource.
- required: false
- type: str
- name:
- description:
- - Name of the resource. The name is 1-63 characters long and complies with RFC1035.
- required: true
- type: str
- properties:
- description:
- - The instance properties for this instance template.
- required: false
- type: dict
- suboptions:
- can_ip_forward:
- description:
- - Enables instances created based on this template to send packets with source
- IP addresses other than their own and receive packets with destination IP
- addresses other than their own. If these instances will be used as an IP
- gateway or it will be set as the next-hop in a Route resource, specify true.
- If unsure, leave this set to false.
- required: false
- type: bool
- description:
- description:
- - An optional text description for the instances that are created from this
- instance template.
- required: false
- type: str
- disks:
- description:
- - An array of disks that are associated with the instances that are created
- from this template.
- required: false
- type: list
- suboptions:
- auto_delete:
- description:
- - Specifies whether the disk will be auto-deleted when the instance is
- deleted (but not when the disk is detached from the instance).
- - 'Tip: Disks should be set to autoDelete=true so that leftover disks
- are not left behind on machine deletion.'
- required: false
- type: bool
- boot:
- description:
- - Indicates that this is a boot disk. The virtual machine will use the
- first partition of the disk for its root filesystem.
- required: false
- type: bool
- device_name:
- description:
- - Specifies a unique device name of your choice that is reflected into
- the /dev/disk/by-id/google-* tree of a Linux operating system running
- within the instance. This name can be used to reference the device for
- mounting, resizing, and so on, from within the instance.
- required: false
- type: str
- disk_encryption_key:
- description:
- - Encrypts or decrypts a disk using a customer-supplied encryption key.
- required: false
- type: dict
- suboptions:
- raw_key:
- description:
- - Specifies a 256-bit customer-supplied encryption key, encoded in
- RFC 4648 base64 to either encrypt or decrypt this resource.
- required: false
- type: str
- rsa_encrypted_key:
- description:
- - Specifies an RFC 4648 base64 encoded, RSA-wrapped 2048-bit customer-supplied
- encryption key to either encrypt or decrypt this resource.
- required: false
- type: str
- index:
- description:
- - Assigns a zero-based index to this disk, where 0 is reserved for the
- boot disk. For example, if you have many disks attached to an instance,
- each disk would have a unique index number. If not specified, the server
- will choose an appropriate value.
- required: false
- type: int
- initialize_params:
- description:
- - Specifies the parameters for a new disk that will be created alongside
- the new instance. Use initialization parameters to create boot disks
- or local SSDs attached to the new instance.
- required: false
- type: dict
- suboptions:
- disk_name:
- description:
- - Specifies the disk name. If not specified, the default is to use
- the name of the instance.
- required: false
- type: str
- disk_size_gb:
- description:
- - Specifies the size of the disk in base-2 GB.
- required: false
- type: int
- disk_type:
- description:
- - Reference to a disk type.
- - Specifies the disk type to use to create the instance.
- - If not specified, the default is pd-standard.
- required: false
- type: str
- source_image:
- description:
- - The source image to create this disk. When creating a new instance,
- one of initializeParams.sourceImage or disks.source is required.
- To create a disk with one of the public operating system images,
- specify the image by its family name.
- required: false
- type: str
- source_image_encryption_key:
- description:
- - The customer-supplied encryption key of the source image. Required
- if the source image is protected by a customer-supplied encryption
- key.
- - Instance templates do not store customer-supplied encryption keys,
- so you cannot create disks for instances in a managed instance group
- if the source images are encrypted with your own keys.
- required: false
- type: dict
- suboptions:
- raw_key:
- description:
- - Specifies a 256-bit customer-supplied encryption key, encoded
- in RFC 4648 base64 to either encrypt or decrypt this resource.
- required: false
- type: str
- interface:
- description:
- - Specifies the disk interface to use for attaching this disk, which is
- either SCSI or NVME. The default is SCSI.
- - Persistent disks must always use SCSI and the request will fail if you
- attempt to attach a persistent disk in any other format than SCSI.
- - 'Some valid choices include: "SCSI", "NVME"'
- required: false
- type: str
- mode:
- description:
- - The mode in which to attach this disk, either READ_WRITE or READ_ONLY.
- If not specified, the default is to attach the disk in READ_WRITE mode.
- - 'Some valid choices include: "READ_WRITE", "READ_ONLY"'
- required: false
- type: str
- source:
- description:
- - Reference to a disk. When creating a new instance, one of initializeParams.sourceImage
- or disks.source is required.
- - If desired, you can also attach existing non-root persistent disks using
- this property. This field is only applicable for persistent disks.
- - Note that for InstanceTemplate, specify the disk name, not the URL for
- the disk.
- - 'This field represents a link to a Disk 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_compute_disk task and then set this source
- field to "{{ name-of-resource }}"'
- required: false
- type: dict
- type:
- description:
- - Specifies the type of the disk, either SCRATCH or PERSISTENT. If not
- specified, the default is PERSISTENT.
- - 'Some valid choices include: "SCRATCH", "PERSISTENT"'
- required: false
- type: str
- labels:
- description:
- - Labels to apply to this address. A list of key->value pairs.
- required: false
- type: dict
- version_added: '2.9'
- machine_type:
- description:
- - The machine type to use in the VM instance template.
- required: true
- type: str
- min_cpu_platform:
- description:
- - Specifies a minimum CPU platform for the VM instance. Applicable values
- are the friendly names of CPU platforms .
- required: false
- type: str
- metadata:
- description:
- - The metadata key/value pairs to assign to instances that are created from
- this template. These pairs can consist of custom metadata or predefined
- keys.
- required: false
- type: dict
- guest_accelerators:
- description:
- - List of the type and count of accelerator cards attached to the instance
- .
- required: false
- type: list
- suboptions:
- accelerator_count:
- description:
- - The number of the guest accelerator cards exposed to this instance.
- required: false
- type: int
- accelerator_type:
- description:
- - Full or partial URL of the accelerator type resource to expose to this
- instance.
- required: false
- type: str
- network_interfaces:
- description:
- - An array of configurations for this interface. This specifies how this interface
- is configured to interact with other network services, such as connecting
- to the internet. Only one network interface is supported per instance.
- required: false
- type: list
- suboptions:
- access_configs:
- description:
- - An array of configurations for this interface. Currently, only one access
- config, ONE_TO_ONE_NAT, is supported. If there are no accessConfigs
- specified, then this instance will have no external internet access.
- required: false
- type: list
- suboptions:
- name:
- description:
- - The name of this access configuration. The default and recommended
- name is External NAT but you can use any arbitrary string you would
- like. For example, My external IP or Network Access.
- required: true
- type: str
- nat_ip:
- description:
- - Reference to an address.
- - An external IP address associated with this instance.
- - Specify an unused static external IP address available to the project
- or leave this field undefined to use an IP from a shared ephemeral
- IP address pool. If you specify a static external IP address, it
- must live in the same region as the zone of the instance.
- - 'This field represents a link to a Address resource in GCP. It can
- be specified in two ways. First, you can place a dictionary with
- key ''address'' and value of your resource''s address Alternatively,
- you can add `register: name-of-resource` to a gcp_compute_address
- task and then set this nat_ip field to "{{ name-of-resource }}"'
- required: false
- type: dict
- type:
- description:
- - The type of configuration. The default and only option is ONE_TO_ONE_NAT.
- - 'Some valid choices include: "ONE_TO_ONE_NAT"'
- required: true
- type: str
- set_public_ptr:
- description:
- - Specifies whether a public DNS PTR record should be created to map
- the external IP address of the instance to a DNS domain name.
- required: false
- type: bool
- version_added: '2.10'
- public_ptr_domain_name:
- description:
- - The DNS domain name for the public PTR record. You can set this
- field only if the setPublicPtr field is enabled.
- required: false
- type: str
- version_added: '2.10'
- network_tier:
- description:
- - This signifies the networking tier used for configuring this access
- configuration. If an AccessConfig is specified without a valid external
- IP address, an ephemeral IP will be created with this networkTier.
- If an AccessConfig with a valid external IP address is specified,
- it must match that of the networkTier associated with the Address
- resource owning that IP.
- - 'Some valid choices include: "PREMIUM", "STANDARD"'
- required: false
- type: str
- version_added: '2.10'
- alias_ip_ranges:
- description:
- - An array of alias IP ranges for this network interface. Can only be
- specified for network interfaces on subnet-mode networks.
- required: false
- type: list
- suboptions:
- ip_cidr_range:
- description:
- - The IP CIDR range represented by this alias IP range.
- - This IP CIDR range must belong to the specified subnetwork and cannot
- contain IP addresses reserved by system or used by other network
- interfaces. This range may be a single IP address (e.g. 10.2.3.4),
- a netmask (e.g. /24) or a CIDR format string (e.g. 10.1.2.0/24).
- required: false
- type: str
- subnetwork_range_name:
- description:
- - Optional subnetwork secondary range name specifying the secondary
- range from which to allocate the IP CIDR range for this alias IP
- range. If left unspecified, the primary range of the subnetwork
- will be used.
- required: false
- type: str
- network:
- description:
- - Specifies the title of an existing network. When creating an instance,
- if neither the network nor the subnetwork is specified, the default
- network global/networks/default is used; if the network is not specified
- but the subnetwork is specified, the network is inferred.
- - 'This field represents a link to a Network resource in GCP. It can be
- specified in two ways. First, you can place a dictionary with key ''selfLink''
- and value of your resource''s selfLink Alternatively, you can add `register:
- name-of-resource` to a gcp_compute_network task and then set this network
- field to "{{ name-of-resource }}"'
- required: false
- type: dict
- network_ip:
- description:
- - An IPv4 internal network address to assign to the instance for this
- network interface. If not specified by the user, an unused internal
- IP is assigned by the system.
- required: false
- type: str
- subnetwork:
- description:
- - Reference to a VPC network.
- - If the network resource is in legacy mode, do not provide this property.
- If the network is in auto subnet mode, providing the subnetwork is optional.
- If the network is in custom subnet mode, then this field should be specified.
- - 'This field represents a link to a Subnetwork resource in GCP. It can
- be specified in two ways. First, you can place a dictionary with key
- ''selfLink'' and value of your resource''s selfLink Alternatively, you
- can add `register: name-of-resource` to a gcp_compute_subnetwork task
- and then set this subnetwork field to "{{ name-of-resource }}"'
- required: false
- type: dict
- scheduling:
- description:
- - Sets the scheduling options for this instance.
- required: false
- type: dict
- suboptions:
- automatic_restart:
- description:
- - Specifies whether the instance should be automatically restarted if
- it is terminated by Compute Engine (not terminated by a user).
- - You can only set the automatic restart option for standard instances.
- Preemptible instances cannot be automatically restarted.
- required: false
- type: bool
- on_host_maintenance:
- description:
- - Defines the maintenance behavior for this instance. For standard instances,
- the default behavior is MIGRATE. For preemptible instances, the default
- and only possible behavior is TERMINATE.
- - For more information, see Setting Instance Scheduling Options.
- required: false
- type: str
- preemptible:
- description:
- - Defines whether the instance is preemptible. This can only be set during
- instance creation, it cannot be set or changed after the instance has
- been created.
- required: false
- type: bool
- service_accounts:
- description:
- - A list of service accounts, with their specified scopes, authorized for
- this instance. Only one service account per VM instance is supported.
- required: false
- type: list
- suboptions:
- email:
- description:
- - Email address of the service account.
- required: false
- type: str
- scopes:
- description:
- - The list of scopes to be made available for this service account.
- required: false
- type: list
- tags:
- description:
- - A list of tags to apply to this instance. Tags are used to identify valid
- sources or targets for network firewalls and are specified by the client
- during instance creation. The tags can be later modified by the setTags
- method. Each tag within the list must comply with RFC1035.
- required: false
- type: dict
- suboptions:
- fingerprint:
- description:
- - Specifies a fingerprint for this request, which is essentially a hash
- of the metadata's contents and used for optimistic locking.
- - The fingerprint is initially generated by Compute Engine and changes
- after every request to modify or update metadata. You must always provide
- an up-to-date fingerprint hash in order to update or change metadata.
- required: false
- type: str
- items:
- description:
- - An array of tags. Each tag must be 1-63 characters long, and comply
- with RFC1035.
- required: false
- type: list
- 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
- 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
- scopes:
- description:
- - Array of scopes to be used
- type: list
- 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 network
- gcp_compute_network:
- name: network-instancetemplate
- project: "{{ gcp_project }}"
- auth_kind: "{{ gcp_cred_kind }}"
- service_account_file: "{{ gcp_cred_file }}"
- state: present
- register: network
-
-- name: create a address
- gcp_compute_address:
- name: address-instancetemplate
- region: us-west1
- project: "{{ gcp_project }}"
- auth_kind: "{{ gcp_cred_kind }}"
- service_account_file: "{{ gcp_cred_file }}"
- state: present
- register: address
-
-- name: create a instance template
- gcp_compute_instance_template:
- name: test_object
- properties:
- disks:
- - auto_delete: 'true'
- boot: 'true'
- initialize_params:
- source_image: projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts
- machine_type: n1-standard-1
- network_interfaces:
- - network: "{{ network }}"
- access_configs:
- - name: test-config
- type: ONE_TO_ONE_NAT
- nat_ip: "{{ address }}"
- project: test_project
- auth_kind: serviceaccount
- service_account_file: "/tmp/auth.pem"
- state: present
-'''
-
-RETURN = '''
-creationTimestamp:
- description:
- - Creation timestamp in RFC3339 text format.
- returned: success
- type: str
-description:
- description:
- - An optional description of this resource. Provide this property when you create
- the resource.
- returned: success
- type: str
-id:
- description:
- - The unique identifier for the resource. This identifier is defined by the server.
- returned: success
- type: int
-name:
- description:
- - Name of the resource. The name is 1-63 characters long and complies with RFC1035.
- returned: success
- type: str
-properties:
- description:
- - The instance properties for this instance template.
- returned: success
- type: complex
- contains:
- canIpForward:
- description:
- - Enables instances created based on this template to send packets with source
- IP addresses other than their own and receive packets with destination IP
- addresses other than their own. If these instances will be used as an IP gateway
- or it will be set as the next-hop in a Route resource, specify true. If unsure,
- leave this set to false.
- returned: success
- type: bool
- description:
- description:
- - An optional text description for the instances that are created from this
- instance template.
- returned: success
- type: str
- disks:
- description:
- - An array of disks that are associated with the instances that are created
- from this template.
- returned: success
- type: complex
- contains:
- autoDelete:
- description:
- - Specifies whether the disk will be auto-deleted when the instance is deleted
- (but not when the disk is detached from the instance).
- - 'Tip: Disks should be set to autoDelete=true so that leftover disks are
- not left behind on machine deletion.'
- returned: success
- type: bool
- boot:
- description:
- - Indicates that this is a boot disk. The virtual machine will use the first
- partition of the disk for its root filesystem.
- returned: success
- type: bool
- deviceName:
- description:
- - Specifies a unique device name of your choice that is reflected into the
- /dev/disk/by-id/google-* tree of a Linux operating system running within
- the instance. This name can be used to reference the device for mounting,
- resizing, and so on, from within the instance.
- returned: success
- type: str
- diskEncryptionKey:
- description:
- - Encrypts or decrypts a disk using a customer-supplied encryption key.
- returned: success
- type: complex
- contains:
- rawKey:
- description:
- - Specifies a 256-bit customer-supplied encryption key, encoded in RFC
- 4648 base64 to either encrypt or decrypt this resource.
- returned: success
- type: str
- rsaEncryptedKey:
- description:
- - Specifies an RFC 4648 base64 encoded, RSA-wrapped 2048-bit customer-supplied
- encryption key to either encrypt or decrypt this resource.
- returned: success
- type: str
- sha256:
- description:
- - The RFC 4648 base64 encoded SHA-256 hash of the customer-supplied
- encryption key that protects this resource.
- returned: success
- type: str
- index:
- description:
- - Assigns a zero-based index to this disk, where 0 is reserved for the boot
- disk. For example, if you have many disks attached to an instance, each
- disk would have a unique index number. If not specified, the server will
- choose an appropriate value.
- returned: success
- type: int
- initializeParams:
- description:
- - Specifies the parameters for a new disk that will be created alongside
- the new instance. Use initialization parameters to create boot disks or
- local SSDs attached to the new instance.
- returned: success
- type: complex
- contains:
- diskName:
- description:
- - Specifies the disk name. If not specified, the default is to use the
- name of the instance.
- returned: success
- type: str
- diskSizeGb:
- description:
- - Specifies the size of the disk in base-2 GB.
- returned: success
- type: int
- diskType:
- description:
- - Reference to a disk type.
- - Specifies the disk type to use to create the instance.
- - If not specified, the default is pd-standard.
- returned: success
- type: str
- sourceImage:
- description:
- - The source image to create this disk. When creating a new instance,
- one of initializeParams.sourceImage or disks.source is required. To
- create a disk with one of the public operating system images, specify
- the image by its family name.
- returned: success
- type: str
- sourceImageEncryptionKey:
- description:
- - The customer-supplied encryption key of the source image. Required
- if the source image is protected by a customer-supplied encryption
- key.
- - Instance templates do not store customer-supplied encryption keys,
- so you cannot create disks for instances in a managed instance group
- if the source images are encrypted with your own keys.
- returned: success
- type: complex
- contains:
- rawKey:
- description:
- - Specifies a 256-bit customer-supplied encryption key, encoded
- in RFC 4648 base64 to either encrypt or decrypt this resource.
- returned: success
- type: str
- sha256:
- description:
- - The RFC 4648 base64 encoded SHA-256 hash of the customer-supplied
- encryption key that protects this resource.
- returned: success
- type: str
- interface:
- description:
- - Specifies the disk interface to use for attaching this disk, which is
- either SCSI or NVME. The default is SCSI.
- - Persistent disks must always use SCSI and the request will fail if you
- attempt to attach a persistent disk in any other format than SCSI.
- returned: success
- type: str
- mode:
- description:
- - The mode in which to attach this disk, either READ_WRITE or READ_ONLY.
- If not specified, the default is to attach the disk in READ_WRITE mode.
- returned: success
- type: str
- source:
- description:
- - Reference to a disk. When creating a new instance, one of initializeParams.sourceImage
- or disks.source is required.
- - If desired, you can also attach existing non-root persistent disks using
- this property. This field is only applicable for persistent disks.
- - Note that for InstanceTemplate, specify the disk name, not the URL for
- the disk.
- returned: success
- type: dict
- type:
- description:
- - Specifies the type of the disk, either SCRATCH or PERSISTENT. If not specified,
- the default is PERSISTENT.
- returned: success
- type: str
- labels:
- description:
- - Labels to apply to this address. A list of key->value pairs.
- returned: success
- type: dict
- machineType:
- description:
- - The machine type to use in the VM instance template.
- returned: success
- type: str
- minCpuPlatform:
- description:
- - Specifies a minimum CPU platform for the VM instance. Applicable values are
- the friendly names of CPU platforms .
- returned: success
- type: str
- metadata:
- description:
- - The metadata key/value pairs to assign to instances that are created from
- this template. These pairs can consist of custom metadata or predefined keys.
- returned: success
- type: dict
- guestAccelerators:
- description:
- - List of the type and count of accelerator cards attached to the instance .
- returned: success
- type: complex
- contains:
- acceleratorCount:
- description:
- - The number of the guest accelerator cards exposed to this instance.
- returned: success
- type: int
- acceleratorType:
- description:
- - Full or partial URL of the accelerator type resource to expose to this
- instance.
- returned: success
- type: str
- networkInterfaces:
- description:
- - An array of configurations for this interface. This specifies how this interface
- is configured to interact with other network services, such as connecting
- to the internet. Only one network interface is supported per instance.
- returned: success
- type: complex
- contains:
- accessConfigs:
- description:
- - An array of configurations for this interface. Currently, only one access
- config, ONE_TO_ONE_NAT, is supported. If there are no accessConfigs specified,
- then this instance will have no external internet access.
- returned: success
- type: complex
- contains:
- name:
- description:
- - The name of this access configuration. The default and recommended
- name is External NAT but you can use any arbitrary string you would
- like. For example, My external IP or Network Access.
- returned: success
- type: str
- natIP:
- description:
- - Reference to an address.
- - An external IP address associated with this instance.
- - Specify an unused static external IP address available to the project
- or leave this field undefined to use an IP from a shared ephemeral
- IP address pool. If you specify a static external IP address, it must
- live in the same region as the zone of the instance.
- returned: success
- type: dict
- type:
- description:
- - The type of configuration. The default and only option is ONE_TO_ONE_NAT.
- returned: success
- type: str
- setPublicPtr:
- description:
- - Specifies whether a public DNS PTR record should be created to map
- the external IP address of the instance to a DNS domain name.
- returned: success
- type: bool
- publicPtrDomainName:
- description:
- - The DNS domain name for the public PTR record. You can set this field
- only if the setPublicPtr field is enabled.
- returned: success
- type: str
- networkTier:
- description:
- - This signifies the networking tier used for configuring this access
- configuration. If an AccessConfig is specified without a valid external
- IP address, an ephemeral IP will be created with this networkTier.
- If an AccessConfig with a valid external IP address is specified,
- it must match that of the networkTier associated with the Address
- resource owning that IP.
- returned: success
- type: str
- aliasIpRanges:
- description:
- - An array of alias IP ranges for this network interface. Can only be specified
- for network interfaces on subnet-mode networks.
- returned: success
- type: complex
- contains:
- ipCidrRange:
- description:
- - The IP CIDR range represented by this alias IP range.
- - This IP CIDR range must belong to the specified subnetwork and cannot
- contain IP addresses reserved by system or used by other network interfaces.
- This range may be a single IP address (e.g. 10.2.3.4), a netmask (e.g.
- /24) or a CIDR format string (e.g. 10.1.2.0/24).
- returned: success
- type: str
- subnetworkRangeName:
- description:
- - Optional subnetwork secondary range name specifying the secondary
- range from which to allocate the IP CIDR range for this alias IP range.
- If left unspecified, the primary range of the subnetwork will be used.
- returned: success
- type: str
- name:
- description:
- - The name of the network interface, generated by the server. For network
- devices, these are eth0, eth1, etc .
- returned: success
- type: str
- network:
- description:
- - Specifies the title of an existing network. When creating an instance,
- if neither the network nor the subnetwork is specified, the default network
- global/networks/default is used; if the network is not specified but the
- subnetwork is specified, the network is inferred.
- returned: success
- type: dict
- networkIP:
- description:
- - An IPv4 internal network address to assign to the instance for this network
- interface. If not specified by the user, an unused internal IP is assigned
- by the system.
- returned: success
- type: str
- subnetwork:
- description:
- - Reference to a VPC network.
- - If the network resource is in legacy mode, do not provide this property.
- If the network is in auto subnet mode, providing the subnetwork is optional.
- If the network is in custom subnet mode, then this field should be specified.
- returned: success
- type: dict
- scheduling:
- description:
- - Sets the scheduling options for this instance.
- returned: success
- type: complex
- contains:
- automaticRestart:
- description:
- - Specifies whether the instance should be automatically restarted if it
- is terminated by Compute Engine (not terminated by a user).
- - You can only set the automatic restart option for standard instances.
- Preemptible instances cannot be automatically restarted.
- returned: success
- type: bool
- onHostMaintenance:
- description:
- - Defines the maintenance behavior for this instance. For standard instances,
- the default behavior is MIGRATE. For preemptible instances, the default
- and only possible behavior is TERMINATE.
- - For more information, see Setting Instance Scheduling Options.
- returned: success
- type: str
- preemptible:
- description:
- - Defines whether the instance is preemptible. This can only be set during
- instance creation, it cannot be set or changed after the instance has
- been created.
- returned: success
- type: bool
- serviceAccounts:
- description:
- - A list of service accounts, with their specified scopes, authorized for this
- instance. Only one service account per VM instance is supported.
- returned: success
- type: complex
- contains:
- email:
- description:
- - Email address of the service account.
- returned: success
- type: str
- scopes:
- description:
- - The list of scopes to be made available for this service account.
- returned: success
- type: list
- tags:
- description:
- - A list of tags to apply to this instance. Tags are used to identify valid
- sources or targets for network firewalls and are specified by the client during
- instance creation. The tags can be later modified by the setTags method. Each
- tag within the list must comply with RFC1035.
- returned: success
- type: complex
- contains:
- fingerprint:
- description:
- - Specifies a fingerprint for this request, which is essentially a hash
- of the metadata's contents and used for optimistic locking.
- - The fingerprint is initially generated by Compute Engine and changes after
- every request to modify or update metadata. You must always provide an
- up-to-date fingerprint hash in order to update or change metadata.
- returned: success
- type: str
- items:
- description:
- - An array of tags. Each tag must be 1-63 characters long, and comply with
- RFC1035.
- returned: success
- type: list
-'''
-
-################################################################################
-# Imports
-################################################################################
-
-from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest, remove_nones_from_dict, replace_resource_dict
-import json
-import re
-import time
-
-################################################################################
-# Main
-################################################################################
-
-
-def main():
- """Main function"""
-
- module = GcpModule(
- argument_spec=dict(
- state=dict(default='present', choices=['present', 'absent'], type='str'),
- description=dict(type='str'),
- name=dict(required=True, type='str'),
- properties=dict(
- type='dict',
- options=dict(
- can_ip_forward=dict(type='bool'),
- description=dict(type='str'),
- disks=dict(
- type='list',
- elements='dict',
- options=dict(
- auto_delete=dict(type='bool'),
- boot=dict(type='bool'),
- device_name=dict(type='str'),
- disk_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'), rsa_encrypted_key=dict(type='str'))),
- index=dict(type='int'),
- initialize_params=dict(
- type='dict',
- options=dict(
- disk_name=dict(type='str'),
- disk_size_gb=dict(type='int'),
- disk_type=dict(type='str'),
- source_image=dict(type='str'),
- source_image_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'))),
- ),
- ),
- interface=dict(type='str'),
- mode=dict(type='str'),
- source=dict(type='dict'),
- type=dict(type='str'),
- ),
- ),
- labels=dict(type='dict'),
- machine_type=dict(required=True, type='str'),
- min_cpu_platform=dict(type='str'),
- metadata=dict(type='dict'),
- guest_accelerators=dict(type='list', elements='dict', options=dict(accelerator_count=dict(type='int'), accelerator_type=dict(type='str'))),
- network_interfaces=dict(
- type='list',
- elements='dict',
- options=dict(
- access_configs=dict(
- type='list',
- elements='dict',
- options=dict(
- name=dict(required=True, type='str'),
- nat_ip=dict(type='dict'),
- type=dict(required=True, type='str'),
- set_public_ptr=dict(type='bool'),
- public_ptr_domain_name=dict(type='str'),
- network_tier=dict(type='str'),
- ),
- ),
- alias_ip_ranges=dict(
- type='list', elements='dict', options=dict(ip_cidr_range=dict(type='str'), subnetwork_range_name=dict(type='str'))
- ),
- network=dict(type='dict'),
- network_ip=dict(type='str'),
- subnetwork=dict(type='dict'),
- ),
- ),
- scheduling=dict(
- type='dict', options=dict(automatic_restart=dict(type='bool'), on_host_maintenance=dict(type='str'), preemptible=dict(type='bool'))
- ),
- service_accounts=dict(type='list', elements='dict', options=dict(email=dict(type='str'), scopes=dict(type='list', elements='str'))),
- tags=dict(type='dict', options=dict(fingerprint=dict(type='str'), items=dict(type='list', elements='str'))),
- ),
- ),
- )
- )
-
- if not module.params['scopes']:
- module.params['scopes'] = ['https://www.googleapis.com/auth/compute']
-
- state = module.params['state']
- kind = 'compute#instanceTemplate'
-
- fetch = fetch_resource(module, self_link(module), kind)
- changed = False
-
- if fetch:
- if state == 'present':
- if is_different(module, fetch):
- update(module, self_link(module), kind)
- fetch = fetch_resource(module, self_link(module), kind)
- changed = True
- else:
- delete(module, self_link(module), kind)
- fetch = {}
- changed = True
- else:
- if state == 'present':
- fetch = create(module, collection(module), kind)
- changed = True
- else:
- fetch = {}
-
- fetch.update({'changed': changed})
-
- module.exit_json(**fetch)
-
-
-def create(module, link, kind):
- auth = GcpSession(module, 'compute')
- return wait_for_operation(module, auth.post(link, resource_to_request(module)))
-
-
-def update(module, link, kind):
- delete(module, self_link(module), kind)
- create(module, collection(module), kind)
-
-
-def delete(module, link, kind):
- auth = GcpSession(module, 'compute')
- return wait_for_operation(module, auth.delete(link))
-
-
-def resource_to_request(module):
- request = {
- u'kind': 'compute#instanceTemplate',
- u'description': module.params.get('description'),
- u'name': module.params.get('name'),
- u'properties': InstanceTemplateProperties(module.params.get('properties', {}), module).to_request(),
- }
- request = encode_request(request, module)
- 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, kind, allow_not_found=True):
- auth = GcpSession(module, 'compute')
- return return_if_object(module, auth.get(link), kind, allow_not_found)
-
-
-def self_link(module):
- return "https://www.googleapis.com/compute/v1/projects/{project}/global/instanceTemplates/{name}".format(**module.params)
-
-
-def collection(module):
- return "https://www.googleapis.com/compute/v1/projects/{project}/global/instanceTemplates".format(**module.params)
-
-
-def return_if_object(module, response, kind, 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'creationTimestamp': response.get(u'creationTimestamp'),
- u'description': response.get(u'description'),
- u'id': response.get(u'id'),
- u'name': response.get(u'name'),
- u'properties': InstanceTemplateProperties(response.get(u'properties', {}), module).from_response(),
- }
-
-
-def disk_type_selflink(name, params):
- if name is None:
- return
- url = r"https://www.googleapis.com/compute/v1/projects/.*/zones/.*/diskTypes/.*"
- if not re.match(url, name):
- name = "https://www.googleapis.com/compute/v1/projects/{project}/zones/{zone}/diskTypes/%s".format(**params) % name
- return name
-
-
-def async_op_url(module, extra_data=None):
- if extra_data is None:
- extra_data = {}
- url = "https://www.googleapis.com/compute/v1/projects/{project}/global/operations/{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, 'compute#operation')
- if op_result is None:
- return {}
- status = navigate_hash(op_result, ['status'])
- wait_done = wait_for_completion(status, op_result, module)
- response = fetch_resource(module, navigate_hash(wait_done, ['targetLink']), 'compute#instanceTemplate')
- if response:
- return decode_response(response, module)
- else:
- return {}
-
-
-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 status != 'DONE':
- raise_if_errors(op_result, ['error', 'errors'], module)
- time.sleep(1.0)
- op_result = fetch_resource(module, op_uri, 'compute#operation', False)
- status = navigate_hash(op_result, ['status'])
- 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)
-
-
-def encode_request(request, module):
- if 'properties' in request and request['properties'] is not None and 'metadata' in request['properties'] and request['properties']['metadata'] is not None:
- request['properties']['metadata'] = metadata_encoder(request['properties']['metadata'])
- return request
-
-
-def decode_response(response, module):
- if (
- 'properties' in response
- and response['properties'] is not None
- and 'metadata' in response['properties']
- and response['properties']['metadata'] is not None
- ):
- response['properties']['metadata'] = metadata_decoder(response['properties']['metadata'])
- return response
-
-
-# TODO(alexstephen): Implement updating metadata on existing resources.
-
-# Expose instance 'metadata' as a simple name/value pair hash. However the API
-# defines metadata as a NestedObject with the following layout:
-#
-# metadata {
-# fingerprint: 'hash-of-last-metadata'
-# items: [
-# {
-# key: 'metadata1-key'
-# value: 'metadata1-value'
-# },
-# ...
-# ]
-# }
-#
-def metadata_encoder(metadata):
- metadata_new = []
- for key in metadata:
- value = metadata[key]
- metadata_new.append({"key": key, "value": value})
- return {'items': metadata_new}
-
-
-# Map metadata.items[]{key:,value:} => metadata[key]=value
-def metadata_decoder(metadata):
- items = {}
- if 'items' in metadata:
- metadata_items = metadata['items']
- for item in metadata_items:
- items[item['key']] = item['value']
- return items
-
-
-class InstanceTemplateProperties(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'canIpForward': self.request.get('can_ip_forward'),
- u'description': self.request.get('description'),
- u'disks': InstanceTemplateDisksArray(self.request.get('disks', []), self.module).to_request(),
- u'labels': self.request.get('labels'),
- u'machineType': self.request.get('machine_type'),
- u'minCpuPlatform': self.request.get('min_cpu_platform'),
- u'metadata': self.request.get('metadata'),
- u'guestAccelerators': InstanceTemplateGuestacceleratorsArray(self.request.get('guest_accelerators', []), self.module).to_request(),
- u'networkInterfaces': InstanceTemplateNetworkinterfacesArray(self.request.get('network_interfaces', []), self.module).to_request(),
- u'scheduling': InstanceTemplateScheduling(self.request.get('scheduling', {}), self.module).to_request(),
- u'serviceAccounts': InstanceTemplateServiceaccountsArray(self.request.get('service_accounts', []), self.module).to_request(),
- u'tags': InstanceTemplateTags(self.request.get('tags', {}), self.module).to_request(),
- }
- )
-
- def from_response(self):
- return remove_nones_from_dict(
- {
- u'canIpForward': self.request.get(u'canIpForward'),
- u'description': self.request.get(u'description'),
- u'disks': InstanceTemplateDisksArray(self.request.get(u'disks', []), self.module).from_response(),
- u'labels': self.request.get(u'labels'),
- u'machineType': self.request.get(u'machineType'),
- u'minCpuPlatform': self.request.get(u'minCpuPlatform'),
- u'metadata': self.request.get(u'metadata'),
- u'guestAccelerators': InstanceTemplateGuestacceleratorsArray(self.request.get(u'guestAccelerators', []), self.module).from_response(),
- u'networkInterfaces': InstanceTemplateNetworkinterfacesArray(self.request.get(u'networkInterfaces', []), self.module).from_response(),
- u'scheduling': InstanceTemplateScheduling(self.request.get(u'scheduling', {}), self.module).from_response(),
- u'serviceAccounts': InstanceTemplateServiceaccountsArray(self.request.get(u'serviceAccounts', []), self.module).from_response(),
- u'tags': InstanceTemplateTags(self.request.get(u'tags', {}), self.module).from_response(),
- }
- )
-
-
-class InstanceTemplateDisksArray(object):
- def __init__(self, request, module):
- self.module = module
- if request:
- self.request = request
- else:
- self.request = []
-
- def to_request(self):
- items = []
- for item in self.request:
- items.append(self._request_for_item(item))
- return items
-
- def from_response(self):
- items = []
- for item in self.request:
- items.append(self._response_from_item(item))
- return items
-
- def _request_for_item(self, item):
- return remove_nones_from_dict(
- {
- u'autoDelete': item.get('auto_delete'),
- u'boot': item.get('boot'),
- u'deviceName': item.get('device_name'),
- u'diskEncryptionKey': InstanceTemplateDiskencryptionkey(item.get('disk_encryption_key', {}), self.module).to_request(),
- u'index': item.get('index'),
- u'initializeParams': InstanceTemplateInitializeparams(item.get('initialize_params', {}), self.module).to_request(),
- u'interface': item.get('interface'),
- u'mode': item.get('mode'),
- u'source': replace_resource_dict(item.get(u'source', {}), 'name'),
- u'type': item.get('type'),
- }
- )
-
- def _response_from_item(self, item):
- return remove_nones_from_dict(
- {
- u'autoDelete': item.get(u'autoDelete'),
- u'boot': item.get(u'boot'),
- u'deviceName': item.get(u'deviceName'),
- u'diskEncryptionKey': InstanceTemplateDiskencryptionkey(item.get(u'diskEncryptionKey', {}), self.module).from_response(),
- u'index': item.get(u'index'),
- u'initializeParams': InstanceTemplateInitializeparams(self.module.params.get('initialize_params', {}), self.module).to_request(),
- u'interface': item.get(u'interface'),
- u'mode': item.get(u'mode'),
- u'source': item.get(u'source'),
- u'type': item.get(u'type'),
- }
- )
-
-
-class InstanceTemplateDiskencryptionkey(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'rawKey': self.request.get('raw_key'), u'rsaEncryptedKey': self.request.get('rsa_encrypted_key')})
-
- def from_response(self):
- return remove_nones_from_dict({u'rawKey': self.request.get(u'rawKey'), u'rsaEncryptedKey': self.request.get(u'rsaEncryptedKey')})
-
-
-class InstanceTemplateInitializeparams(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'diskName': self.request.get('disk_name'),
- u'diskSizeGb': self.request.get('disk_size_gb'),
- u'diskType': disk_type_selflink(self.request.get('disk_type'), self.module.params),
- u'sourceImage': self.request.get('source_image'),
- u'sourceImageEncryptionKey': InstanceTemplateSourceimageencryptionkey(
- self.request.get('source_image_encryption_key', {}), self.module
- ).to_request(),
- }
- )
-
- def from_response(self):
- return remove_nones_from_dict(
- {
- u'diskName': self.request.get(u'diskName'),
- u'diskSizeGb': self.request.get(u'diskSizeGb'),
- u'diskType': self.request.get(u'diskType'),
- u'sourceImage': self.request.get(u'sourceImage'),
- u'sourceImageEncryptionKey': InstanceTemplateSourceimageencryptionkey(
- self.request.get(u'sourceImageEncryptionKey', {}), self.module
- ).from_response(),
- }
- )
-
-
-class InstanceTemplateSourceimageencryptionkey(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'rawKey': self.request.get('raw_key')})
-
- def from_response(self):
- return remove_nones_from_dict({u'rawKey': self.request.get(u'rawKey')})
-
-
-class InstanceTemplateGuestacceleratorsArray(object):
- def __init__(self, request, module):
- self.module = module
- if request:
- self.request = request
- else:
- self.request = []
-
- def to_request(self):
- items = []
- for item in self.request:
- items.append(self._request_for_item(item))
- return items
-
- def from_response(self):
- items = []
- for item in self.request:
- items.append(self._response_from_item(item))
- return items
-
- def _request_for_item(self, item):
- return remove_nones_from_dict({u'acceleratorCount': item.get('accelerator_count'), u'acceleratorType': item.get('accelerator_type')})
-
- def _response_from_item(self, item):
- return remove_nones_from_dict({u'acceleratorCount': item.get(u'acceleratorCount'), u'acceleratorType': item.get(u'acceleratorType')})
-
-
-class InstanceTemplateNetworkinterfacesArray(object):
- def __init__(self, request, module):
- self.module = module
- if request:
- self.request = request
- else:
- self.request = []
-
- def to_request(self):
- items = []
- for item in self.request:
- items.append(self._request_for_item(item))
- return items
-
- def from_response(self):
- items = []
- for item in self.request:
- items.append(self._response_from_item(item))
- return items
-
- def _request_for_item(self, item):
- return remove_nones_from_dict(
- {
- u'accessConfigs': InstanceTemplateAccessconfigsArray(item.get('access_configs', []), self.module).to_request(),
- u'aliasIpRanges': InstanceTemplateAliasiprangesArray(item.get('alias_ip_ranges', []), self.module).to_request(),
- u'network': replace_resource_dict(item.get(u'network', {}), 'selfLink'),
- u'networkIP': item.get('network_ip'),
- u'subnetwork': replace_resource_dict(item.get(u'subnetwork', {}), 'selfLink'),
- }
- )
-
- def _response_from_item(self, item):
- return remove_nones_from_dict(
- {
- u'accessConfigs': InstanceTemplateAccessconfigsArray(item.get(u'accessConfigs', []), self.module).from_response(),
- u'aliasIpRanges': InstanceTemplateAliasiprangesArray(item.get(u'aliasIpRanges', []), self.module).from_response(),
- u'network': item.get(u'network'),
- u'networkIP': item.get(u'networkIP'),
- u'subnetwork': item.get(u'subnetwork'),
- }
- )
-
-
-class InstanceTemplateAccessconfigsArray(object):
- def __init__(self, request, module):
- self.module = module
- if request:
- self.request = request
- else:
- self.request = []
-
- def to_request(self):
- items = []
- for item in self.request:
- items.append(self._request_for_item(item))
- return items
-
- def from_response(self):
- items = []
- for item in self.request:
- items.append(self._response_from_item(item))
- return items
-
- def _request_for_item(self, item):
- return remove_nones_from_dict(
- {
- u'name': item.get('name'),
- u'natIP': replace_resource_dict(item.get(u'nat_ip', {}), 'address'),
- u'type': item.get('type'),
- u'setPublicPtr': item.get('set_public_ptr'),
- u'publicPtrDomainName': item.get('public_ptr_domain_name'),
- u'networkTier': item.get('network_tier'),
- }
- )
-
- def _response_from_item(self, item):
- return remove_nones_from_dict(
- {
- u'name': item.get(u'name'),
- u'natIP': item.get(u'natIP'),
- u'type': item.get(u'type'),
- u'setPublicPtr': item.get(u'setPublicPtr'),
- u'publicPtrDomainName': item.get(u'publicPtrDomainName'),
- u'networkTier': item.get(u'networkTier'),
- }
- )
-
-
-class InstanceTemplateAliasiprangesArray(object):
- def __init__(self, request, module):
- self.module = module
- if request:
- self.request = request
- else:
- self.request = []
-
- def to_request(self):
- items = []
- for item in self.request:
- items.append(self._request_for_item(item))
- return items
-
- def from_response(self):
- items = []
- for item in self.request:
- items.append(self._response_from_item(item))
- return items
-
- def _request_for_item(self, item):
- return remove_nones_from_dict({u'ipCidrRange': item.get('ip_cidr_range'), u'subnetworkRangeName': item.get('subnetwork_range_name')})
-
- def _response_from_item(self, item):
- return remove_nones_from_dict({u'ipCidrRange': item.get(u'ipCidrRange'), u'subnetworkRangeName': item.get(u'subnetworkRangeName')})
-
-
-class InstanceTemplateScheduling(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'automaticRestart': self.request.get('automatic_restart'),
- u'onHostMaintenance': self.request.get('on_host_maintenance'),
- u'preemptible': self.request.get('preemptible'),
- }
- )
-
- def from_response(self):
- return remove_nones_from_dict(
- {
- u'automaticRestart': self.request.get(u'automaticRestart'),
- u'onHostMaintenance': self.request.get(u'onHostMaintenance'),
- u'preemptible': self.request.get(u'preemptible'),
- }
- )
-
-
-class InstanceTemplateServiceaccountsArray(object):
- def __init__(self, request, module):
- self.module = module
- if request:
- self.request = request
- else:
- self.request = []
-
- def to_request(self):
- items = []
- for item in self.request:
- items.append(self._request_for_item(item))
- return items
-
- def from_response(self):
- items = []
- for item in self.request:
- items.append(self._response_from_item(item))
- return items
-
- def _request_for_item(self, item):
- return remove_nones_from_dict({u'email': item.get('email'), u'scopes': item.get('scopes')})
-
- def _response_from_item(self, item):
- return remove_nones_from_dict({u'email': item.get(u'email'), u'scopes': item.get(u'scopes')})
-
-
-class InstanceTemplateTags(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'fingerprint': self.request.get('fingerprint'), u'items': self.request.get('items')})
-
- def from_response(self):
- return remove_nones_from_dict({u'fingerprint': self.request.get(u'fingerprint'), u'items': self.request.get(u'items')})
-
-
-if __name__ == '__main__':
- main()