blob: d47318fd219dcdd6ed834abad66fe1a2aec1b2c2 [file] [log] [blame]
Patricia Reinoso38fb5da2023-04-27 13:48:50 +00001#########################################################################
Mark Beierl9e1379d2023-04-06 15:12:46 +00002#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12# implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
Dario Faccinf5d65b52023-06-19 12:35:33 +020016from temporalio import activity
Gulsum Atici50d12e02023-04-27 16:41:43 +030017from typing import List, Any
18
Dario Faccinf5d65b52023-06-19 12:35:33 +020019from osm_common.temporal.activities.vnf import (
20 GetTaskQueue,
21 GetVimCloud,
22 GetVnfDescriptor,
23 GetVnfRecord,
24 ChangeVnfState,
25 ChangeVnfInstantiationState,
26 SetVnfModel,
27 SendNotificationForVnf,
28)
29from osm_common.temporal.dataclasses_common import VduComputeConstraints
30from osm_common.temporal_task_queues.task_queues_mappings import (
Gulsum Atici36365402023-04-07 00:07:07 +030031 VIM_TYPE_TASK_QUEUE_MAPPINGS,
Mark Beierl9e1379d2023-04-06 15:12:46 +000032)
Mark Beierl9e1379d2023-04-06 15:12:46 +000033
Gulsum Atici50d12e02023-04-27 16:41:43 +030034CONFIG_IDENTIFIER = "config::"
35
36
Mark Beierl82629422023-06-29 20:22:36 +000037@activity.defn(name=GetTaskQueue.__name__)
Dario Faccinf5d65b52023-06-19 12:35:33 +020038class GetTaskQueueImpl(GetTaskQueue):
Dario Faccinf5d65b52023-06-19 12:35:33 +020039 async def __call__(self, activity_input: GetTaskQueue.Input) -> GetTaskQueue.Output:
40 vnfr = self.db.get_one("vnfrs", {"_id": activity_input.vnfr_uuid})
Gulsum Atici36365402023-04-07 00:07:07 +030041 vim_record = self.db.get_one("vim_accounts", {"_id": vnfr["vim-account-id"]})
Gulsum Atici625a6542023-04-18 15:27:18 +030042 task_queue = VIM_TYPE_TASK_QUEUE_MAPPINGS[vim_record["vim_type"]]
Mark Beierl9e1379d2023-04-06 15:12:46 +000043 self.logger.debug(f"Got the task queue {task_queue} for VNF operations.")
Dario Faccinf5d65b52023-06-19 12:35:33 +020044 return GetTaskQueue.Output(task_queue)
Mark Beierl9e1379d2023-04-06 15:12:46 +000045
Gulsum Aticia1898b42023-04-25 15:48:10 +030046
Mark Beierl82629422023-06-29 20:22:36 +000047@activity.defn(name=GetVimCloud.__name__)
Dario Faccinf5d65b52023-06-19 12:35:33 +020048class GetVimCloudImpl(GetVimCloud):
Dario Faccinf5d65b52023-06-19 12:35:33 +020049 async def __call__(self, activity_input: GetVimCloud.Input) -> GetVimCloud.Output:
50 vnfr = self.db.get_one("vnfrs", {"_id": activity_input.vnfr_uuid})
Gulsum Aticia1898b42023-04-25 15:48:10 +030051 vim_record = self.db.get_one("vim_accounts", {"_id": vnfr["vim-account-id"]})
52 cloud = vim_record["config"].get("cloud", "")
53 self.logger.debug(f"Got the cloud type {cloud} for VNF operations.")
Dario Faccinf5d65b52023-06-19 12:35:33 +020054 return GetVimCloud.Output(cloud=cloud)
Gulsum Aticia1898b42023-04-25 15:48:10 +030055
Gulsum Atici36365402023-04-07 00:07:07 +030056
Mark Beierl82629422023-06-29 20:22:36 +000057@activity.defn(name=GetVnfRecord.__name__)
Dario Faccinf5d65b52023-06-19 12:35:33 +020058class GetVnfRecordImpl(GetVnfRecord):
Dario Faccinf5d65b52023-06-19 12:35:33 +020059 async def __call__(self, activity_input: GetVnfRecord.Input) -> GetVnfRecord.Output:
60 vnfr = self.db.get_one("vnfrs", {"_id": activity_input.vnfr_uuid})
Gulsum Atici50d12e02023-04-27 16:41:43 +030061 self.logger.debug("Got the vnfr from Database for VNF operations.")
Dario Faccinf5d65b52023-06-19 12:35:33 +020062 return GetVnfRecord.Output(vnfr=vnfr)
Gulsum Atici50d12e02023-04-27 16:41:43 +030063
Gulsum Atici50d12e02023-04-27 16:41:43 +030064
Mark Beierl82629422023-06-29 20:22:36 +000065@activity.defn(name=GetVnfDescriptor.__name__)
Dario Faccinf5d65b52023-06-19 12:35:33 +020066class GetVnfDescriptorImpl(GetVnfDescriptor):
Dario Faccinf5d65b52023-06-19 12:35:33 +020067 async def __call__(
68 self, activity_input: GetVnfDescriptor.Input
69 ) -> GetVnfDescriptor.Output:
70 vnfd = self.db.get_one("vnfds", {"_id": activity_input.vnfd_uuid})
71 return GetVnfDescriptor.Output(vnfd=vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +030072
Gulsum Atici50d12e02023-04-27 16:41:43 +030073
Dario Faccinf5d65b52023-06-19 12:35:33 +020074class VnfSpecifications:
Gulsum Atici50d12e02023-04-27 16:41:43 +030075 @staticmethod
76 def get_vdu_instantiation_params(
77 vdu_id: str, vnf_instantiation_config: dict
78 ) -> dict:
79 for vdu in vnf_instantiation_config.get("vdu", []):
80 if vdu.get("id") == vdu_id:
81 return vdu.get("configurable-properties", {})
82 return {}
83
84 @staticmethod
85 def get_compute_constraints(vdu: dict, vnfd: dict) -> VduComputeConstraints:
86 compute_desc_id = vdu.get("virtual-compute-desc")
87 if not compute_desc_id:
88 return VduComputeConstraints(cores=0, mem=0)
Dario Faccinf5d65b52023-06-19 12:35:33 +020089 flavor_details = VnfSpecifications._get_flavor_details(compute_desc_id, vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +030090 if not flavor_details:
91 return VduComputeConstraints(cores=0, mem=0)
92
93 cpu_cores = flavor_details.get("virtual-cpu", {}).get("num-virtual-cpu", 0)
94 memory_gb = flavor_details.get("virtual-memory", {}).get("size", 0)
95 return VduComputeConstraints(cores=cpu_cores, mem=int(memory_gb))
96
97 @staticmethod
98 def _get_flavor_details(compute_desc_id: str, vnfd: dict) -> Any:
99 for flavor in vnfd.get("virtual-compute-desc", []):
100 if flavor.get("id") == compute_desc_id:
101 return flavor
102 return None
103
104 @staticmethod
105 def get_application_config(vdu: dict, vdu_instantiation_config: dict) -> dict:
106 configurable_properties = vdu.get("configurable-properties", [])
107
Dario Faccinf5d65b52023-06-19 12:35:33 +0200108 config_from_descriptor = VnfSpecifications._get_only_config_items(
109 VnfSpecifications._list_to_dict(configurable_properties)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300110 )
111
Dario Faccinf5d65b52023-06-19 12:35:33 +0200112 config_from_instantiation = VnfSpecifications._get_only_config_items(
Gulsum Atici50d12e02023-04-27 16:41:43 +0300113 vdu_instantiation_config
114 )
115 return {**config_from_descriptor, **config_from_instantiation}
116
117 @staticmethod
118 def _get_only_config_items(config: dict) -> dict:
119 return {
120 key[len(CONFIG_IDENTIFIER) :]: value
121 for key, value in config.items()
122 if key.startswith(CONFIG_IDENTIFIER)
123 }
124
125 @staticmethod
126 def _list_to_dict(indata: List[dict]) -> dict:
127 return {
128 item["key"]: item["value"]
129 for item in indata
130 if item.get("key") and item.get("value")
131 }
Gulsum Atici36365402023-04-07 00:07:07 +0300132
Mark Beierl9e1379d2023-04-06 15:12:46 +0000133
Mark Beierl82629422023-06-29 20:22:36 +0000134@activity.defn(name=ChangeVnfState.__name__)
Dario Faccinf5d65b52023-06-19 12:35:33 +0200135class ChangeVnfStateImpl(ChangeVnfState):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200136 async def __call__(self, activity_input: ChangeVnfState.Input) -> None:
137 update_vnf_state = {"vnfState": activity_input.state.name}
138 self.db.set_one("vnfrs", {"_id": activity_input.vnfr_uuid}, update_vnf_state)
Mark Beierl9e1379d2023-04-06 15:12:46 +0000139 self.logger.debug(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200140 f"VNF {activity_input.vnfr_uuid} state is updated to {activity_input.state.name}."
Mark Beierl9e1379d2023-04-06 15:12:46 +0000141 )
142
Mark Beierl9e1379d2023-04-06 15:12:46 +0000143
Mark Beierl82629422023-06-29 20:22:36 +0000144@activity.defn(name=ChangeVnfInstantiationState.__name__)
Dario Faccinf5d65b52023-06-19 12:35:33 +0200145class ChangeVnfInstantiationStateImpl(ChangeVnfInstantiationState):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200146 async def __call__(self, activity_input: ChangeVnfInstantiationState.Input) -> None:
Dario Faccin0568c6c2023-04-14 10:19:07 +0200147 update_vnf_instantiation_state = {
Dario Faccinf5d65b52023-06-19 12:35:33 +0200148 "instantiationState": activity_input.state.name
Mark Beierl9e1379d2023-04-06 15:12:46 +0000149 }
150 self.db.set_one(
151 "vnfrs",
Dario Faccinf5d65b52023-06-19 12:35:33 +0200152 {"_id": activity_input.vnfr_uuid},
Dario Faccin0568c6c2023-04-14 10:19:07 +0200153 update_vnf_instantiation_state,
Mark Beierl9e1379d2023-04-06 15:12:46 +0000154 )
155 self.logger.debug(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200156 f"VNF {activity_input.vnfr_uuid} state is updated to {activity_input.state.name}."
Mark Beierl9e1379d2023-04-06 15:12:46 +0000157 )
158
Dario Faccin39301762023-04-17 16:56:37 +0200159
Mark Beierl82629422023-06-29 20:22:36 +0000160@activity.defn(name=SetVnfModel.__name__)
Dario Faccinf5d65b52023-06-19 12:35:33 +0200161class SetVnfModelImpl(SetVnfModel):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200162 async def __call__(self, activity_input: SetVnfModel.Input) -> None:
163 update_namespace = {"namespace": activity_input.model_name}
164 self.db.set_one("vnfrs", {"_id": activity_input.vnfr_uuid}, update_namespace)
Dario Faccin39301762023-04-17 16:56:37 +0200165 self.logger.debug(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200166 f"VNF {activity_input.vnfr_uuid} model name is updated to {activity_input.model_name}."
Dario Faccin39301762023-04-17 16:56:37 +0200167 )
168
Dario Faccin0568c6c2023-04-14 10:19:07 +0200169
Mark Beierl82629422023-06-29 20:22:36 +0000170@activity.defn(name=SendNotificationForVnf.__name__)
Dario Faccinf5d65b52023-06-19 12:35:33 +0200171class SendNotificationForVnfImpl(SendNotificationForVnf):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200172 async def __call__(self, activity_input: SendNotificationForVnf.Input) -> None:
Dario Faccin0568c6c2023-04-14 10:19:07 +0200173 self.logger.debug("Send notification for VNF not implemented.")