1#!/usr/bin/python
2#
3# Copyright (c) 2018 Yuwei Zhou, <yuwzho@microsoft.com>
4#
5# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
6
7from __future__ import absolute_import, division, print_function
8__metaclass__ = type
9
10
11ANSIBLE_METADATA = {'metadata_version': '1.1',
12                    'status': ['preview'],
13                    'supported_by': 'community'}
14
15DOCUMENTATION = '''
16---
17module: azure_rm_aks_info
18
19version_added: "2.9"
20
21short_description: Get Azure Kubernetes Service facts
22
23description:
24    - Get facts for a specific Azure Kubernetes Service or all Azure Kubernetes Services.
25
26options:
27    name:
28        description:
29            - Limit results to a specific resource group.
30    resource_group:
31        description:
32            - The resource group to search for the desired Azure Kubernetes Service
33    tags:
34        description:
35            - Limit results by providing a list of tags. Format tags as 'key' or 'key:value'.
36    show_kubeconfig:
37        description:
38            - Show kubeconfig of the AKS cluster.
39            - Note the operation will cost more network overhead, not recommended when listing AKS.
40        version_added: "2.8"
41        choices:
42            - user
43            - admin
44
45extends_documentation_fragment:
46    - azure
47
48author:
49    - Yuwei Zhou (@yuwzho)
50'''
51
52EXAMPLES = '''
53    - name: Get facts for one Azure Kubernetes Service
54      azure_rm_aks_info:
55        name: Testing
56        resource_group: myResourceGroup
57
58    - name: Get facts for all Azure Kubernetes Services
59      azure_rm_aks_info:
60
61    - name: Get facts by tags
62      azure_rm_aks_info:
63        tags:
64          - testing
65'''
66
67RETURN = '''
68azure_aks:
69    description: List of Azure Kubernetes Service dicts.
70    returned: always
71    type: list
72'''
73
74from ansible.module_utils.azure_rm_common import AzureRMModuleBase
75
76try:
77    from msrestazure.azure_exceptions import CloudError
78    from azure.common import AzureHttpError
79except Exception:
80    # handled in azure_rm_common
81    pass
82
83AZURE_OBJECT_CLASS = 'managedClusters'
84
85
86class AzureRMManagedClusterInfo(AzureRMModuleBase):
87    """Utility class to get Azure Kubernetes Service facts"""
88
89    def __init__(self):
90
91        self.module_args = dict(
92            name=dict(type='str'),
93            resource_group=dict(type='str'),
94            tags=dict(type='list'),
95            show_kubeconfig=dict(type='str', choices=['user', 'admin']),
96        )
97
98        self.results = dict(
99            changed=False,
100            aks=[],
101            available_versions=[]
102        )
103
104        self.name = None
105        self.resource_group = None
106        self.tags = None
107        self.show_kubeconfig = None
108
109        super(AzureRMManagedClusterInfo, self).__init__(
110            derived_arg_spec=self.module_args,
111            supports_tags=False,
112            facts_module=True
113        )
114
115    def exec_module(self, **kwargs):
116
117        is_old_facts = self.module._name == 'azure_rm_aks_facts'
118        if is_old_facts:
119            self.module.deprecate("The 'azure_rm_aks_facts' module has been renamed to 'azure_rm_aks_info'", version='2.13')
120
121        for key in self.module_args:
122            setattr(self, key, kwargs[key])
123
124        self.results['aks'] = (
125            self.get_item() if self.name
126            else self.list_items()
127        )
128
129        return self.results
130
131    def get_item(self):
132        """Get a single Azure Kubernetes Service"""
133
134        self.log('Get properties for {0}'.format(self.name))
135
136        item = None
137        result = []
138
139        try:
140            item = self.managedcluster_client.managed_clusters.get(self.resource_group, self.name)
141        except CloudError:
142            pass
143
144        if item and self.has_tags(item.tags, self.tags):
145            result = [self.serialize_obj(item, AZURE_OBJECT_CLASS)]
146            if self.show_kubeconfig:
147                result[0]['kube_config'] = self.get_aks_kubeconfig(self.resource_group, self.name)
148
149        return result
150
151    def list_items(self):
152        """Get all Azure Kubernetes Services"""
153
154        self.log('List all Azure Kubernetes Services')
155
156        try:
157            response = self.managedcluster_client.managed_clusters.list(self.resource_group)
158        except AzureHttpError as exc:
159            self.fail('Failed to list all items - {0}'.format(str(exc)))
160
161        results = []
162        for item in response:
163            if self.has_tags(item.tags, self.tags):
164                item_dict = self.serialize_obj(item, AZURE_OBJECT_CLASS)
165                if self.show_kubeconfig:
166                    item_dict['kube_config'] = self.get_aks_kubeconfig(self.resource_group, item.name)
167                results.append(item_dict)
168
169        return results
170
171    def get_aks_kubeconfig(self, resource_group, name):
172        '''
173        Gets kubeconfig for the specified AKS instance.
174
175        :return: AKS instance kubeconfig
176        '''
177        if not self.show_kubeconfig:
178            return ''
179        role_name = 'cluster{0}'.format(str.capitalize(self.show_kubeconfig))
180        access_profile = self.managedcluster_client.managed_clusters.get_access_profile(resource_group, name, role_name)
181        return access_profile.kube_config.decode('utf-8')
182
183
184def main():
185    """Main module execution code path"""
186
187    AzureRMManagedClusterInfo()
188
189
190if __name__ == '__main__':
191    main()
192