| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| # not use this file except in compliance with the License. You may obtain |
| # a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations |
| # under the License. |
| # |
| |
| """ |
| OSM K8s cluster API handling |
| """ |
| |
| from osmclient.common import utils |
| from osmclient.common.exceptions import NotFound |
| from osmclient.common.exceptions import ClientException |
| import json |
| |
| |
| class K8scluster(object): |
| def __init__(self, http=None, client=None): |
| self._http = http |
| self._client = client |
| self._apiName = "/admin" |
| self._apiVersion = "/v1" |
| self._apiResource = "/k8sclusters" |
| self._apiBase = "{}{}{}".format( |
| self._apiName, self._apiVersion, self._apiResource |
| ) |
| |
| def create(self, name, k8s_cluster): |
| def get_vim_account_id(vim_account): |
| vim = self._client.vim.get(vim_account) |
| if vim is None: |
| raise NotFound("cannot find vim account '{}'".format(vim_account)) |
| return vim["_id"] |
| |
| self._client.get_token() |
| k8s_cluster["vim_account"] = get_vim_account_id(k8s_cluster["vim_account"]) |
| http_code, resp = self._http.post_cmd( |
| endpoint=self._apiBase, postfields_dict=k8s_cluster |
| ) |
| # print 'HTTP CODE: {}'.format(http_code) |
| # print 'RESP: {}'.format(resp) |
| # if http_code in (200, 201, 202, 204): |
| if resp: |
| resp = json.loads(resp) |
| if not resp or "id" not in resp: |
| raise ClientException("unexpected response from server - {}".format(resp)) |
| print(resp["id"]) |
| # else: |
| # msg = "" |
| # if resp: |
| # try: |
| # msg = json.loads(resp) |
| # except ValueError: |
| # msg = resp |
| # raise ClientException("failed to add K8s cluster {} - {}".format(name, msg)) |
| |
| def update(self, name, k8s_cluster): |
| self._client.get_token() |
| cluster = self.get(name) |
| http_code, resp = self._http.put_cmd( |
| endpoint="{}/{}".format(self._apiBase, cluster["_id"]), |
| postfields_dict=k8s_cluster, |
| ) |
| # print 'HTTP CODE: {}'.format(http_code) |
| # print 'RESP: {}'.format(resp) |
| # if http_code in (200, 201, 202, 204): |
| # pass |
| # else: |
| # msg = "" |
| # if resp: |
| # try: |
| # msg = json.loads(resp) |
| # except ValueError: |
| # msg = resp |
| # raise ClientException("failed to update K8s cluster {} - {}".format(name, msg)) |
| |
| def get_id(self, name): |
| """Returns a K8s cluster id from a K8s cluster name""" |
| for cluster in self.list(): |
| if name == cluster["name"]: |
| return cluster["_id"] |
| raise NotFound("K8s cluster {} not found".format(name)) |
| |
| def delete(self, name, force=False): |
| self._client.get_token() |
| cluster_id = name |
| if not utils.validate_uuid4(name): |
| cluster_id = self.get_id(name) |
| querystring = "" |
| if force: |
| querystring = "?FORCE=True" |
| http_code, resp = self._http.delete_cmd( |
| "{}/{}{}".format(self._apiBase, cluster_id, querystring) |
| ) |
| # print 'HTTP CODE: {}'.format(http_code) |
| # print 'RESP: {}'.format(resp) |
| if http_code == 202: |
| print("Deletion in progress") |
| elif http_code == 204: |
| print("Deleted") |
| else: |
| msg = resp or "" |
| # if resp: |
| # try: |
| # msg = json.loads(resp) |
| # except ValueError: |
| # msg = resp |
| raise ClientException( |
| "failed to delete K8s cluster {} - {}".format(name, msg) |
| ) |
| |
| def list(self, filter=None): |
| """Returns a list of K8s clusters""" |
| self._client.get_token() |
| filter_string = "" |
| if filter: |
| filter_string = "?{}".format(filter) |
| _, resp = self._http.get2_cmd("{}{}".format(self._apiBase, filter_string)) |
| if resp: |
| return json.loads(resp) |
| return list() |
| |
| def get(self, name): |
| """Returns a K8s cluster based on name or id""" |
| self._client.get_token() |
| cluster_id = name |
| if not utils.validate_uuid4(name): |
| cluster_id = self.get_id(name) |
| try: |
| _, resp = self._http.get2_cmd("{}/{}".format(self._apiBase, cluster_id)) |
| if resp: |
| resp = json.loads(resp) |
| if not resp or "_id" not in resp: |
| raise ClientException("failed to get K8s cluster info: {}".format(resp)) |
| return resp |
| except NotFound: |
| raise NotFound("K8s cluster {} not found".format(name)) |