blob: 089e5417a40d0648726434a47b17f3e967b9fed9 [file] [log] [blame]
Benjamin Diaz7f11ecf2018-09-14 12:03:38 -03001# -*- coding: utf-8 -*-
2
3# Copyright 2018 Whitestack, LLC
4# *************************************************************
5
6# This file is part of OSM Monitoring module
7# All Rights Reserved to Whitestack, LLC
8
9# Licensed under the Apache License, Version 2.0 (the "License"); you may
10# not use this file except in compliance with the License. You may obtain
11# a copy of the License at
12
13# http://www.apache.org/licenses/LICENSE-2.0
14
15# Unless required by applicable law or agreed to in writing, software
16# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18# License for the specific language governing permissions and limitations
19# under the License.
20
21# For those usages not covered by the Apache License, Version 2.0 please
22# contact: bdiaz@whitestack.com or glavado@whitestack.com
23##
Benjamin Diaz16256cb2018-10-11 12:34:20 -030024import asyncio
Benjamin Diaz7f11ecf2018-09-14 12:03:38 -030025import datetime
26import json
27import logging
28import time
29import uuid
30
Benjamin Diaza14cf162019-02-01 13:31:47 -030031from osm_policy_module.common.common_db_client import CommonDbClient
32from osm_policy_module.common.message_bus_client import MessageBusClient
Benjamin Diaz7f11ecf2018-09-14 12:03:38 -030033from osm_policy_module.core.config import Config
34
35log = logging.getLogger(__name__)
36
37
38class LcmClient:
Benjamin Diaz87c4af92019-08-14 10:27:25 -030039 """
40 Client to communicate with LCM through the message bus.
41 """
42
Benjamin Diaza14cf162019-02-01 13:31:47 -030043 def __init__(self, config: Config, loop=None):
44 self.db_client = CommonDbClient(config)
45 self.msg_bus = MessageBusClient(config)
Benjamin Diaz16256cb2018-10-11 12:34:20 -030046 if not loop:
47 loop = asyncio.get_event_loop()
48 self.loop = loop
Benjamin Diaz7f11ecf2018-09-14 12:03:38 -030049
Benjamin Diaz3736ad82019-06-05 16:24:34 -030050 async def scale(self, nsr_id: str, scaling_group_name: str, vnf_member_index: str, action: str):
Benjamin Diaz87c4af92019-08-14 10:27:25 -030051 """
52 Sends scaling action to LCM through the message bus.
53
54 :param nsr_id: Network service record id
55 :param scaling_group_name: Scaling group name
56 :param vnf_member_index: VNF member index
57 :param action: Scaling action to be executed. Valid values: scale_in, scale_out
58 :return:
59 """
Benjamin Diaz4c5541f2018-10-10 10:53:49 -030060 log.debug("scale %s %s %s %s", nsr_id, scaling_group_name, vnf_member_index, action)
Benjamin Diaz87c4af92019-08-14 10:27:25 -030061 nsr = self.db_client.get_nsr(nsr_id)
62 nslcmop = self._generate_nslcmop(nsr_id, scaling_group_name, vnf_member_index, action, nsr['_admin'])
Benjamin Diaza14cf162019-02-01 13:31:47 -030063 self.db_client.create_nslcmop(nslcmop)
Benjamin Diazf7451f82019-04-01 14:56:26 -030064 log.debug("Sending scale action message: %s", json.dumps(nslcmop))
Benjamin Diaza14cf162019-02-01 13:31:47 -030065 await self.msg_bus.aiowrite("ns", "scale", nslcmop)
Benjamin Diaz7f11ecf2018-09-14 12:03:38 -030066
Benjamin Diaz87c4af92019-08-14 10:27:25 -030067 def _generate_nslcmop(self, nsr_id: str, scaling_group_name: str, vnf_member_index: str, action: str, admin: dict):
68 """
69 Builds scaling nslcmop.
70
71 :param nsr_id: Network service record id
72 :param scaling_group_name: Scaling group name
73 :param vnf_member_index: VNF member index
74 :param action: Scaling action to be executed. Valid values: scale_in, scale_out
75 :param admin: Dict corresponding to the _admin section of the nsr. Required keys: projects_read, projects_write.
76 :return:
77 """
78 log.debug("_generate_nslcmop %s %s %s %s %s", nsr_id, scaling_group_name, vnf_member_index, action, admin)
Benjamin Diaz7f11ecf2018-09-14 12:03:38 -030079 _id = str(uuid.uuid4())
80 now = time.time()
81 params = {
82 "scaleType": "SCALE_VNF",
83 "scaleVnfData": {
84 "scaleVnfType": action.upper(),
85 "scaleByStepData": {
86 "scaling-group-descriptor": scaling_group_name,
Benjamin Diaz3736ad82019-06-05 16:24:34 -030087 "member-vnf-index": vnf_member_index
Benjamin Diaz7f11ecf2018-09-14 12:03:38 -030088 }
89 },
90 "scaleTime": "{}Z".format(datetime.datetime.utcnow().isoformat())
91 }
92
93 nslcmop = {
94 "id": _id,
95 "_id": _id,
96 "operationState": "PROCESSING",
97 "statusEnteredTime": now,
98 "nsInstanceId": nsr_id,
99 "lcmOperationType": "scale",
100 "startTime": now,
101 "isAutomaticInvocation": True,
102 "operationParams": params,
103 "isCancelPending": False,
104 "links": {
105 "self": "/osm/nslcm/v1/ns_lcm_op_occs/" + _id,
106 "nsInstance": "/osm/nslcm/v1/ns_instances/" + nsr_id,
Benjamin Diaz87c4af92019-08-14 10:27:25 -0300107 },
108 "_admin": {
109 "projects_read": admin['projects_read'],
110 "projects_write": admin['projects_write']
Benjamin Diaz7f11ecf2018-09-14 12:03:38 -0300111 }
112 }
113 return nslcmop