From 3aeed1205fbfdfa490cd9cb6108ef9d8b534c7ca Mon Sep 17 00:00:00 2001 From: Austin Cormier Date: Mon, 23 May 2016 19:12:00 -0400 Subject: [PATCH] Initial Makefile for descriptor packages --- .gitignore | 1 + Makefile | 44 ++ src/gen_nsd_pkg.sh | 47 ++ src/gen_vnfd_pkg.sh | 47 ++ src/generate_descriptor_pkg.sh | 27 ++ src/nsd/ims_allin1_corpa/IMS-corpA__nsd.yaml | 57 +++ src/nsd/ims_allin1_corpa/icons/osm_2x.png | Bin 0 -> 55888 bytes .../vnf_config/IMS-ALLIN1_2p__1.yaml | 4 + .../ims_allin1_2p_vnf/IMS-ALLIN1__vnfd.yaml | 85 ++++ .../charms/clearwater-aio-proxy/README.md | 53 +++ .../charms/clearwater-aio-proxy/actions.yaml | 19 + .../actions/create-update-user | 23 + .../clearwater-aio-proxy/actions/create-user | 17 + .../clearwater-aio-proxy/actions/delete-user | 16 + .../charms/clearwater-aio-proxy/config.yaml | 20 + .../charms/clearwater-aio-proxy/copyright | 31 ++ .../clearwater-aio-proxy/hooks/config-changed | 20 + .../charms/clearwater-aio-proxy/hooks/install | 10 + .../charms/clearwater-aio-proxy/hooks/start | 7 + .../charms/clearwater-aio-proxy/hooks/stop | 10 + .../clearwater-aio-proxy/hooks/upgrade-charm | 8 + .../charms/clearwater-aio-proxy/icon.svg | 407 ++++++++++++++++++ .../clearwater-aio-proxy/lib/reconfigure-aio | 55 +++ .../charms/clearwater-aio-proxy/metadata.yaml | 10 + .../charms/clearwater-aio-proxy/revision | 1 + .../ims_allin1_2p_vnf/icons/metaswitch_2x.png | Bin 0 -> 2799 bytes 26 files changed, 1019 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100755 src/gen_nsd_pkg.sh create mode 100755 src/gen_vnfd_pkg.sh create mode 100755 src/generate_descriptor_pkg.sh create mode 100644 src/nsd/ims_allin1_corpa/IMS-corpA__nsd.yaml create mode 100644 src/nsd/ims_allin1_corpa/icons/osm_2x.png create mode 100644 src/nsd/ims_allin1_corpa/vnf_config/IMS-ALLIN1_2p__1.yaml create mode 100644 src/vnfd/ims_allin1_2p_vnf/IMS-ALLIN1__vnfd.yaml create mode 100644 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/README.md create mode 100644 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions.yaml create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/create-update-user create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/create-user create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/delete-user create mode 100644 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/config.yaml create mode 100644 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/copyright create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/config-changed create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/install create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/start create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/stop create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/upgrade-charm create mode 100644 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/icon.svg create mode 100755 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/lib/reconfigure-aio create mode 100644 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/metadata.yaml create mode 100644 src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/revision create mode 100644 src/vnfd/ims_allin1_2p_vnf/icons/metaswitch_2x.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1b2211df --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build* diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..0a01862a --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +BUILD_DIR = build + +NSDS := gw_corpa_ns ims_allin1_corpa mwc16_gen_ns mwc16_pe_ns +NSD_SRC_DIR := src/nsd +NSD_BUILD_DIR := $(BUILD_DIR)/nsd + +NSD_SRC_DIRS := $(addprefix $(NSD_SRC_DIR)/, $(NSDS)) +NSD_BUILD_DIRS := $(addprefix $(NSD_BUILD_DIR)/, $(NSDS)) +NSD_PKGS := $(addsuffix .tar.gz, $(NSDS)) +NSD_BUILD_PKGS := $(addprefix $(NSD_BUILD_DIR)_pkgs/, $(NSD_PKGS)) + +VNFDS := 6wind_vnf gw_corpa_pe1_vnf gw_corpa_pe2_vnf ims_allin1_2p_vnf tidgen_mwc16_vnf +VNFD_SRC_DIR := src/vnfd +VNFD_BUILD_DIR := $(BUILD_DIR)/vnfd + +VNFD_SRC_DIRS := $(addprefix $(VNFD_SRC_DIR)/, $(VNFDS)) +VNFD_BUILD_DIRS := $(addprefix $(VNFD_BUILD_DIR)/, $(VNFDS)) +VNFD_PKGS := $(addsuffix .tar.gz, $(VNFDS)) +VNFD_BUILD_PKGS := $(addprefix $(VNFD_BUILD_DIR)_pkgs/, $(VNFD_PKGS)) + +all: $(VNFD_BUILD_PKGS) ${NSD_BUILD_PKGS} + echo $@ + +clean: + -@ $(RM) -rf $(BUILD_DIR) + +$(VNFD_BUILD_DIR)/%: $(VNFD_SRC_DIR)/% + mkdir -p $(VNFD_BUILD_DIR) + cp -rf $< $(VNFD_BUILD_DIR) + + src/gen_vnfd_pkg.sh $< $@ + src/generate_descriptor_pkg.sh $(BUILD_DIR)/vnfd_pkgs $@ + +$(NSD_BUILD_DIR)/%: $(NSD_SRC_DIR)/% + mkdir -p $(NSD_BUILD_DIR) + cp -rf $< $(NSD_BUILD_DIR) + + src/gen_nsd_pkg.sh $< $@ + +$(BUILD_DIR)/nsd_pkgs/%.tar.gz: $(NSD_BUILD_DIR)/% + src/generate_descriptor_pkg.sh $(BUILD_DIR)/nsd_pkgs $< + +$(BUILD_DIR)/vnfd_pkgs/%.tar.gz: $(VNFD_BUILD_DIR)/% + src/generate_descriptor_pkg.sh $(BUILD_DIR)/vnfd_pkgs $< diff --git a/src/gen_nsd_pkg.sh b/src/gen_nsd_pkg.sh new file mode 100755 index 00000000..ea5e6a71 --- /dev/null +++ b/src/gen_nsd_pkg.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Generates a NSD descriptor package from a source directory +# Usage: +# gen_nsd_pkg.sh + +set -o nounset + +if [ $# -ne 2 ]; then + echo "Error: Must provide 2 parameters" >@2 + exit 1 +fi + +pkg_src_dir="$1" +pkg_dest_dir="$2" + +if [ ! -e ${pkg_src_dir} ]; then + echo "Error: ${pkg_src_dir} does not exist" + exit 1 +fi + +if [ ! -e ${pkg_dest_dir} ]; then + echo "Error: ${pkg_src_dir} does not exist" + exit 1 +fi + +echo "Generating package in directory: ${pkg_dest_dir}" + +# Create any missing directories/files so each package has +# a complete hierachy +nsd_dirs=( ns_config vnf_config icons scripts ) +nsd_files=( README ) + +nsd_dir="${pkg_src_dir}" +echo $(pwd) + +mkdir -p "${pkg_dest_dir}" +cp -rf ${nsd_dir}/* "${pkg_dest_dir}" +for sub_dir in ${nsd_dirs[@]}; do + dir_path=${pkg_dest_dir}/${sub_dir} + mkdir -p ${dir_path} +done + +for file in ${nsd_files[@]}; do + file_path=${pkg_dest_dir}/${file} + touch ${file_path} +done diff --git a/src/gen_vnfd_pkg.sh b/src/gen_vnfd_pkg.sh new file mode 100755 index 00000000..478d5c54 --- /dev/null +++ b/src/gen_vnfd_pkg.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Generates a NSD descriptor package from a source directory +# Usage: +# gen_vnfd_pkg.sh + +set -o nounset + +if [ $# -ne 2 ]; then + echo "Error: Must provide 2 parameters" >@2 + exit 1 +fi + +pkg_src_dir="$1" +pkg_dest_dir="$2" + +if [ ! -e ${pkg_src_dir} ]; then + echo "Error: ${pkg_src_dir} does not exist" + exit 1 +fi + +if [ ! -e ${pkg_dest_dir} ]; then + echo "Error: ${pkg_src_dir} does not exist" + exit 1 +fi + +echo "Generating package in directory: ${pkg_dest_dir}" + +# Create any missing directories/files so each package has +# a complete hierachy +vnfd_dirs=( charms icons scripts images ) +vnfd_files=( README ) + +vnfd_dir="${pkg_src_dir}" +echo $(pwd) + +mkdir -p "${pkg_dest_dir}" +cp -rf ${vnfd_dir}/* "${pkg_dest_dir}" +for sub_dir in ${vnfd_dirs[@]}; do + dir_path=${pkg_dest_dir}/${sub_dir} + mkdir -p ${dir_path} +done + +for file in ${vnfd_files[@]}; do + file_path=${pkg_dest_dir}/${file} + touch ${file_path} +done diff --git a/src/generate_descriptor_pkg.sh b/src/generate_descriptor_pkg.sh new file mode 100755 index 00000000..82ecda13 --- /dev/null +++ b/src/generate_descriptor_pkg.sh @@ -0,0 +1,27 @@ +#! /usr/bin/bash +# STANDARD_RIFT_IO_COPYRIGHT +# Author(s): Anil Gunturu +# Creation Date: 2015/10/09 +# +# This shell script is used to create a descriptor package +# The main functions of this script include: +# - Generate checksums.txt file +# - Generate a tar.gz file + +# Usage: generate_descriptor_pkg.sh + +mkdir -p $1 +mkdir -p $2 + +dest_dir=$(cd $1 && pwd) +pkg_dir=$(cd $2 && pwd) + +echo $(pwd) +cd ${pkg_dir} +rm -rf checksums.txt +find * -type f | + while read file; do + md5sum $file >> checksums.txt + done +cd .. +tar -zcvf ${dest_dir}/$(basename $pkg_dir).tar.gz $(basename $pkg_dir) diff --git a/src/nsd/ims_allin1_corpa/IMS-corpA__nsd.yaml b/src/nsd/ims_allin1_corpa/IMS-corpA__nsd.yaml new file mode 100644 index 00000000..27a1197f --- /dev/null +++ b/src/nsd/ims_allin1_corpa/IMS-corpA__nsd.yaml @@ -0,0 +1,57 @@ +nsd:nsd-catalog: + nsd: + - id: IMS-corpA + name: IMS-corpA + short-name: IMS-corpA + description: All in one Clearwater IMS for corporation A in MWC16 + logo: osm_2x.png + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: IMS-ALLIN1_2p + vld: + - id: data + name: data + type: ELAN + provider-network: + overlay-type: VLAN + physical-network: net-corp + segmentation_id: '108' + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: eth0 + vnfd-id-ref: IMS-ALLIN1_2p + - id: management + name: management + type: ELAN + provider-network: + overlay-type: VLAN + physical-network: net-mgmtOS + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: eth1 + vnfd-id-ref: IMS-ALLIN1_2p + config-primitive: + - name: Update Domain + vnf-primitive-group: + - member-vnf-index-ref: '1' + vnfd-id-ref: IMS-ALLIN1_2p + vnfd-name: cwims_vnfd + primitive: + - index: '1' + name: config + - name: Add User + vnf-primitive-group: + - member-vnf-index-ref: '1' + vnfd-id-ref: IMS-ALLIN1_2p + vnfd-name: cwims_vnfd + primitive: + - index: '1' + name: create-update-user + - name: Delete User + vnf-primitive-group: + - member-vnf-index-ref: '1' + vnfd-id-ref: IMS-ALLIN1_2p + vnfd-name: cwims_vnfd + primitive: + - index: '1' + name: delete-user diff --git a/src/nsd/ims_allin1_corpa/icons/osm_2x.png b/src/nsd/ims_allin1_corpa/icons/osm_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..62012d2a2b491bdcd536d62c3c3c863c0d8c1b33 GIT binary patch literal 55888 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
    duScHe0;pydzZXYcj6S9VzJG z!N4y4o#FSZ$Ka+ql2Is3P^55iura(=k9BOFvuWbbFCQS2aVV-#IV?<|$`@4(ClA!V z2IYpYuU|85x%;q5u(XQd^OhY9PQ7y(GCuM#$cpMSd|~**@Ee+vu^Gh3z{v3P-ya4( zW_AWpZo#I895Il&Abl5pykXGb5ofse^%a8}GcN<@uKf(}t!x?iwDlQ29Nfe3_sb`6 z2NN{;1?uN8b8<3#I(3ZUvcZ z@5=CO_E82_Q9lMyz=OoGVNkP}S6G7Kx>Q8^?4|3^2YWlu{P7Dh?uM?1JZS# z?T^2I8Q9cy7>*o1l=8#b)0}_r!RGwK?I4&sQfL-N zCI%)3Muvqi&w(2V+jQa?-u(W`Ak4ze@cGPZhSKyrh8vT*7}%AS8GgTc$-t?s%JA>! zAJE({!|Qd+7=FEe#UPcE#{e25gGB~t=;hmutKe1{tB439lEC9$zZkf+3>a8=Rx|v1 z^^k#0L<)bT{QkkfuV~1y@$AhO&dnS4NXRJO{q_4dRxdJpI@&Y*`TB(*X88Go;pwd# z3}=oX=ei&uHc#yMInm~2Cm6gWbQ!*}Ff#lF)e~5)KotZ9-t}*<8AMpQ!7VIMU4W{B zcpj)8;$&iBc=zW!!~B=$7!)~$7(zvK82&Q+W8eklKt=`zZZ2L1@Au3MPq(jUxUHqg z@bSn21{Q8U@Rab&W%C%=rR5pKLZZQz{znQVCJqjU&!>+vaBJ%^um}o+$FjhRpadf$ zGXtxH5W}bAml#+@)fpHFB{Gn_h&tEHYe%JRG(=Yk2#Yg-TB)GbE6AAT-N#Q*EAUh7 zY-|jVpTBTfvS`5^Lv?fc>5TdeGLo7MUqHD66f*d=!(~B53#iBfbv;PX2G@_w;9+KC zxc2Q8!9T%Y0hU-_SR zZbEVe!+!==MrLI52(m%-#?SwMz|B^Iig73aMJg9F8^fLtcNw<5yU7qMZor_yDGHAa zbZwyA`-7F4;U_e}Ks|UiQ85N?4JC%ZU(v?f7#J8pBg&xS3e;o<4fmj%2jhcAk$Fut z8Q$&cX885uCIcf2J4^~I4T>-x1tW(2Z-gt}zI-ac3|ei2rjjMoIS@?DF5r!ZC{t#7cfpP_?F99mLz+Gre>+p(z z^noH|*~<&y)SoG74o(yx`*CRmB?4AP76w0IO>kw;_U{h^tBM-Ke;ifW|G$42zTLXY zAmSf}ISd4~1k}&?{q8-((`j7{UoM_y_;O(-gH*{}01&P=5s705m=*5#&f(FocWfGBE%C%}~912g4-`D+VDx5e877 z3Z@)1WC9wy0xeTw6%v6AlENgBX=WydzaKv^e7^^2V*ma2p5g1&9Sj1t=?si)Tnztz z{{#&=BkKUO|Nr~Lz$qlnaPGEpmENa!D}}{no`P0Uf+ZOk7?=wqlNkPkR=i-rpd}Ze zvVPWrd8tO%f3{ePDl?q<@{~c2gP-B=|Njg^ESwDHe6kF$e|=@x`{5qL=f6K0lsJUI zJ!()f0kZ^|1~s#fetO7Yz$3}P!H8{42;5Zxr}|ZIt}wJeKFF~8^<{7q8Ps=K`T8=0 zqks~F4Zi{dsI!PKQjzTiu|W+8P$cuQ^Dr1Ze9N%o)is9SF0KsBNCS^doSY0F_U&Nc z*3<=e2tl)tAiWs)|9=J+K7NKjZ(cEcxpB394F4E@^U8CHe!lWpS4H*&3mZEFs1yQW=HjSi@PHnu_l=H0a~%859JgWK zae1Y`xHdB=HD3Mtl0lhM2%N$}73c5&{}|LbMHuvXBp7aef5Wi*!(FhPEIU7_4+!p2 zBYTF4k&)rxrw0t?yfWZGN0x)JL4h{$=`n_)d)pXpet*Mo`}0rJoxdRp-$eJ zL777s+?N40bzvCfcF>dxs5pa}gN+773TW6yf>)S9^70La?Q&cUoSNDU44@VkXaMv3 zH->lH)`R;b*z}`_{r}G(?CZzCrL4j5?~5!0pG6!4tB@?i->>f&em%d+@bkeb21ZtP z24*fn21Zs+$Q%l&vGM;u12Y#t!;_mAumVY+pyB{j#P|zqF}(csg<;qG+YARk z+-C?E(`Arh<7fEwA5_0U)PiyjC=fwK7NRhM*a|WOlncK9{mHQC<#~u85_#tHQ-%j$ z-!lB*_|5Q#;XlJ)=)wk&TiHNssQ&$DVEp%=fs2(LJkA9Y14RHR;ebX5Kz4)pAbUW4 zCU-$KhHX8w8II~1FbE2R=HQtazFfb|z-Mm5z|6}J9x6ey9+Ub1Kf}MTzZiIp%^2Qp zoyYL+`)6>Eo>RpJJcaQ4?E{8iFK;q@y|SHwUEY*|Lq?B*iAxaN|6vA=f=kFtCZKF|diNGO$YNFq}QMCPG5^%^n#A74SR@%hw;6l{yC- z8^iHCSFIGE{;t#zk!1J+T}%rqZa{ShC`Sk}a)DC;$YNv+mjC~oL5V|pD9+|Gj+ife1C9~;pel<42&H747YFH_Pff+9q8odwH{Qtv!E~f0+q#| z{`_FLwex6M5uZNWS5U_fY6GaK0cH8`|NemM2dFSs3RJX#ic3>o83uhGNpOE*-ixyg z>)u{vIR5D|!^>Zv87xH181DZUW#D8pW-t)6W-wqEVF1m2a4>Q*7|EMIxc2wdpC2E8 zsemkCVPSdV*g&Cpa}W<`wzq4U%wd`{`_NL0j+ieEsg*6mx1L!BLmw% zMg}fs*8gnGY@dY$g)WJUi(h*E?k&RuaZ!fv-@nT&ICQs{{8&I@P7X!hHrNciynC|+{QR%%I5$7|Nmk6hc?i~!OqTb{`PHW>)*ou zTznkhp>mkfpvVF>TS0ApP~^bG@zEf)Ao+N4V}{Akj({Tr#9#LMI)kn9B!&=vBL)VB zKMX(r{b2a_?>hqn6F0-*cRLvP9T+kLHG_|Q|MuOBi;Ihiot^z4D=X{sFJHcZH`{>B zAQu1o`+U1!g4`TXyfH?mnDkL+Xka_$rZ zzpWF)f3!7U$m(Eha7&8u7sLPGpwfm9G};A|!l3{E`_1tG*KcqqlHWRo;oF->4C1V> zF6d}${Q;#XCN>@}1{mhx4Mw+pqddTh=&G692XNa z!`1IE7%u&0Wng9I0jpNx)nHKNQD*r0?=!>qzh4>tfg2613@^VtXSgJ{d%B0e+YW|* z3}5v1^;a1i8?WHu;d%ZCT8V=VAcKG>LaX-+nQCe*2yun^Av0ykh{hSh2}r ziZL=UGW`Qj;esOvQvrs^|G&Q&m^t|wBx2_?@EC^hak4NlaB*=mu)KQx8m^d)m5t%z zy&Lwnzl3brcvu)fMH5^S6z~84Gw?98gL~wJnwOwV%fZOR@az9ChGp-cGTdZPVenVZ zWpI*x$#D1cbp`_=O9o~}7KXn_-DT!~EDQ%2)?JY_6{>pu>@5QaCkJ>796LKZ(Obfh z-HXl!Z7TzrB_$=rATBNrZu|fH_ix9B4I6Bb)iQJQfM**2ffigKOW5~gLvckDF!9yYFhJl74c$wM2L)^&v zkkzq+)+~W~oD2*McYnTRSn=g2gN#5dL%5(7!@vJO8AREH7}WUm7=Hf!ff5<)j2sNt zKA&e`bNX6qYwG;r_pd(;dU|>cuV23gw?2^VAeRk_5YPy#uC6Y)*aL0W5fT#Wym8}( z;*A?Ol0oKzn!8FZ6BsyE)N%LHK?>0@C_KQMiqOOfahVwZGkj&>mVWT?v4(`?pHnPv zpgDw@iHYIGmk;8aU)deG`Psp5{ zV{n!#V36VvWBBnG+Km1GhvC;h)Wrdy-1g)54~DY>JNMX{7;gCd=__dNh(T0TlmS#{ zfa)zQ){!j)YR!O(Esz0!{`~pl=H`~FtgO7~`i1kN;$8uX|H5OuLHkue^2FkQpgs^Y z(!xKYHU44v&nv;e^zkmN`;N#zq|hKg{r&s*zo4MtAw@NH1_j1H-%sDT?#-j7$pBi8 zN{m^cl7rzNGXoQ73=3_TgphvFY$G$TD8uh>yrRE;{$ODF@By;G?jOr%2A0R~-Q+oC z8Nih`7L!2r0w@Y_v;e_r~~+&KxBY&$FILX8BTNUTrI*c zaN*wFdm!y#3<@kzc@Lt&0yH2%W`kCPh>3|YsHmtg{Qvg#z}btZAN|+Tm17{VAOY^2 z|9=_&|7K!fWaGx#H-oFg#`yoAft8bw;rz`<{P)k?Vqm#`?HU89!}sRL7ZJJl|17z9 zI2gYD$DB9;nFUG-pqv0w4~iU+7!0#8GBRlLN-;3JxdB?+&!8({1{qj`DZoLqF>x@Q z{J8huPvsAN|9^3V%XVa?FJ8Q00IiNh7Ndj>8odS;&!EM5pmHD7%m-EQ%q*-7%%JVl z930=+PaQt<%O_NhjRmxZ7u~0rwu5$L{eJO|0W>g)I(~tv7E|Ou!_Pne7_6)vgq##z zI9c9(`~V&%x$*d}lhGe>v44#JaheJ06oQ61K+AWK4d!BEVc7rqA;T|jXNGll9SoO0 zoMia@?-x;(@!vmx8SaaoU#G66c7gRD<^&HY1%p~fpe8G*><2{-h>dJNF>H`IpbGuP zt5*zLckDoM8z_PO`thCN`}hA0tjx>|(*J+0xbyr;5WAuZ1Gd>hWcxt#B7fe$X87^+ zH3OFxs1CtD{eY|&#%5t=VR-ud75}L>PdQjL^>i2*S(q7~J%4Va!7dD*^noeFpg|k; z85qIC-Y_|KMkatdPLK!Nkm<%&Wn${QfkCo1ZQ+DD!H8BL}7)nPz9= zWH|Y59|N<~k9kHqHVi+1pjP%UwV+hZ#>U0~Dq3#bxWT~7%L|htng&gu3J3`?eEar| z;TN8w2-Fgj;O08?;MwC33@RD|;89>awlHzBGyJ^rfZ^Xyb_UQABT#O^qa3RgBNG$D zm#^PgU;KE<%yRqwJ@8^SsUNHg!ff0OztFq=Xhwj_e9%}HC>wz~eLw#HVp#t92ZMuD z9s?UA1GqW+=ieU&a}h^|W3P9EBLvL|I2Y6fc_?`0u&k2w_E#@op`=>4A}9k?xr1`X z)2B}voSmH+cI?=JQM^Hw!YNR$00l58XNgIOgT+A$3cw5;1jvp*oE$IzpF8pBzl)my z17r{ut7_0>7HFN;hr@>$SOk>8EknWu9HvnqcXD#D{}JL6{Ko=1`{UEE@2v7aS=3p$ zn88Ekm|7qrAj_B;nZP}GP`q(4F)=K7|CB*VIGI6~Qxe?c22C%4I(sr)iVU1AJm6fS z!DoQc)Ma60Wq9!ICc`JyXLA^TYchQPN&J~BpcbK%lM@4|=?d};#C517C?Y^2pvv0N z&=9=&6eb1|$A{U4gcyX6pFZ^B>UBMS6*UIX96YFK0!07=bf*+3;y^Qv*P=WbJ|5lA zz$T{3z$UqzfrU>JJcSD$SOf(UK8v7oe}4aFP?DGV+KW@BJtCw{R6C@}2p?HNFU4NCnmGm&YKoVK<$gPEBb__PLM zBLh@Ny?OIS=*s5xmM`YaU{LOu${-e*$nf*oBk)R;zu&%qPnTd~V`KR7=mEp$vnRmT z{(5zr;nS(*44jJQ3{31i3@rRo3``t63=GVm%}GoQpm}<5B!Na;(IN`88|%v1b8kOg zeEOZ`+55K)cb`3yG5#$K+6w?GiNF?MC;o$H1AqSg!|?szPli>WJ~24TMl$^VhuP2g z_x~S*Ae#t-Hopf4DWVqV0gD{3j@2f9s`%UBg5ZMFTs;iOzbzn1Bm~=e_~){ z<78kJRbgP^69+eqLH!l*mWF?z)+{3f?h#Q>UF z133a01{GPHOswG9xYOU?F$nT{Gl;PZG2rU>frdv+gzXsCJetE`_{W-o1w4liid0sH z2Y+rc@N2Ly<>TgO_{|D(7%p3Ji-S6hpcD-{4g;hLRD6MkLqNwNfdUpZ1q~7>1%u4` z_wV0PMn=Y;|NsAI=QXur5Q~Um`2YJq19-d&G+gobFF3`6wmk4?Su(JShA?m{=rb^L z3p4zeh74zcas+6X)!)xA8UB2H&hYp1D~7)xUoian@Py&-_mAMnVUyHkU}EEDc(%2J z!9+Cx-3sZ!nzr&CF1s?F>)#*z|#l zD0XH}1}%O=hTYHCG6c#cGJOB@m4TUomErQgV|QP^e}3Z2@vkJMU}Sqh5df;}L6HIz z2jv`4zXDkdCPxenDh@?NL{9RtvpHSm6Wb`t^xg8;RtKnvVJLnCLuJY``1^pwF>`Xqy~ur1z5 z0Tokvf))(7KVM^b^7S5r6sJ7Hho5g5?s8w)CeJVR^XIo;;6)Y~77{7&_3Kygl1z|t zSd&&+SsBEo2&>7;9DDNd*F9!oVG+hVv9U0`UcQQfMZlKf|DUhmd2)0$pr`@m z6o$W`sV|r;BLg$PBm;|}EO;M1o0Ja2x4Y*V48<6>XlrThU}5?FkAeLk6Dz3o1k-|z z26djk{Q1T3w6(MtZa#d-Fn7f&;%50kn(^TOKfW{kH?sI7iDkm;L=uR`2QDA+Ze+R@Bv@op?A<0I0jxp236g32C>J7Mef|b!^OhD z#m?}Tjp;Wi`(x-u5&$i3kYMFuD3G;bXn1st!A{hL!B)(Z;Rm#$MpBBw1ohgLd9)Z- zKb*rb|4uK%=YQ}2v)yIRaB*>Mbaiok2C959G!ZEPDw;NL-pn8-F3w=%;K=am-CG6@ zHg<}(CWEYI`~Qz&*Q<|jUVs12zy>^6@eJ z`_IJi;>kmXFP}d$fQBS6G!QAk`tL8p*RQ{yfr=euEuhUkUydJS_;&X{1GheCXa%!{ ziL4$U8&t>qdUBpY#|uDQ6ny>qb*ELUR@tejs2lfrLVC}j$!a3ZLs9bg4+Ecx#ZMg;R`7HJ zSdNJae2T;CwFem375u?dwqS8GiT}*Z4D7GpFetN|FuY}W!Fv1JBW@PYm{7SDt5-Uu zpI^tYLNA&@fkP0yBowrc7TF$9hw#qNw+!EyH5ho9IT?QZ{emowmko+IP!kxNB6fCm zPEdaW-}n+XeW1Dn6p0TXJ_L9CKx#nUQWj=r27W;i25|{#hW||e8NUDc!obPN4(^wL zCXqnuKp51T0<{7`Y;2hE&mV?wq7q;J{Q3z#)fALdn7KI^Ud&p+@Q*>8ft_E70k-}M zn|{J#j10eje`XMS_=bU>&4u9`(}XTF?b27Gw5-P zGl;SBFt9N(Gk_Mwf$9$dW_E_>zke}EbL)ZD3=*~vssiL`c4iI+SIIzzYah=+MIn@w zl+J0|Hb;f+7`U7DN|<1c|XSGBDiu^5gxbzkeA(Yra9dbKk6A$?)m? zF9sfcbLa{agdS2^p!HjS-ri-9dCkGVD8SCZ^p}l^@jojo%f*Wq*T^c$f3y6^vou@S znCrsV7YqkJ-Us(dKua%8c%{L)X5p*z4AWkmVX&4~W6%>YAjy7E#UCJ>z;OH16^3ok zR)Y1ivao(gOHWO;wYB{QI?ER<2qi!P0tzrtaRiDK2L}hR3`h*b00ksyknzBQ19+Ou z|G`BKXuRvwrymTQ9Dfa%l`F}>6SfdMS{^5sj0jaRQGJ$UrE;?Ink3_QAe3``t`47{dE3=9mv8NeGxVH(Jx z8JQV=e}B!OeD@mz4~G;3sA0s&z{L3fA0s0ZXyqSh1>nh_&+dKx^8-BB0b1O~!^Fk_ zT6O3ysLBv5q7B~g53(CnA3XSai-8HW$Bqd#AVKoDFlYq$*S{YOTug!t^1P-Dn!H|| zm)9^ZxO(%VIH(Q*C@!PmoLx#{PBb8_q#V4UT;{<@a6I$21aJE2_UWHW6)wRc20)B=eILx z|JG&r4_dMhT4KfU_dhEe(?2G8B}E2JH4TQ(Vw{)neSZhvA^^%IKmYv!SMbv8{0yCn zt_+eKQViwV{ou~vs)w@}9(=vcz{$eR0NV3G*oBM?fByesU|@o@TK+P9XV7MiP+i`A zV$P-OXE;F>E~wWHs!u?H^8ER8jDbVKb`Y-u6e*ywF3?a5Xk-{P+#(?%!5}Co$aMYs z^*nTwzTMmp-nIr_JqJ3wi;0B+bg&s{n*nG%3Or!Q$_XA&1f66DQ-?4IG#17NULF7I z?HvZK+YAh1+*;r;VPpWUU;Fy^%dhvpSU@QrbhNjCtmO8)Pd;{NGD@(bFLD57DMuki zhFdIp4AF`?3_t&VV|euK4#SDp`xq|1JHg;A>CYg*D#Y*|+(`tbB7`$wEKmywluH;H zIKT_!K*boS@1XlN-DlavsnZ-no+ldVnKOWjD^Sn-+O=!&))UMOTF{`}AtNmfUX>3j zihlq8!}9OnKQ45;K>N*qJUqkj=hJhB|35x4{QLET0kkX>JS+m*md(Kf-lW6CDZs$Y z!Ns_qJ?QJMU}k|Lfr$Y$KLDEh_{;G3|8E8X9x(>lmk|j^cP@Tl zXkggL#Kg@2D#PEteG85pm|j}YpveF5;XT8bwByLa!v zi@ag>g7yyb8U}%Lz`s8~7#RNkX88B>E5pBEUm5;=|HuFuW(VyL`Seel_I*9axDpQ~;_xLEDXaSp~tR9Z3D3|9==jO-n-|YX)^beTMVzjxsENFpa@f z*dAQr{|9Z`0&imgWvX1IR!lKD^VNIQ<-`xt)QJ^*qw1FMi6gJ@7E z10y>(xbMNp#0s8xVg^k_fhs3Zy}-x}Zt;Q32hiFqQ22pHcR>fT{rv+j-u`}l%kb^S z9Lk1p(pA3+rjX=6V zLHdW0iGhm+bp8j}N{}!ZgGO^f^Bgu}?hIP|Mhr(@?PR$6@hpR}kS&8UuO@i79n=>A zDF!V>{`ViW4DTPxFwO7(-x*~24HzEnXKY^0xRXIno4*AVAs{`p!k|P3TFnBA{QoS> zpaaNQu3W#Bdyd7TjaNT_LrOP_;n(Zi;0Rz9Q)OUc;{mfF?)eYuCxSP1B8LVt8=?+M zGBGp!V`F3B{m;u_Aezg-%ErfFARNr_2b^FT82C}jN1%A zZUteGK2k6T8!LE)IcNn60|SHb!Gi~*zkU7sOFycfWM;bMb&zxx)+w4Yqyx{hk42089*>2GtRu z`UO;+*x3@nU)z`bQ=CRT7Af^5d`|6dst1dSLt zo^n@h|6FMG=ItAq8#ivO`St5p6-XVZ2m?g~DEEMxs~|CAFh~z5QEl0Mh~eYQM+|@e z{s#5(8!leFlmjY*d0#R95{g~O&JNn3172(a+L8>qnF0HDVf!>b>+uQR<616AG^Y8UBJp6K-;n}zA3_G4S zGyM4b8C-^<8Us4U?=QnY#@~#OU)*(M_|Kqv>eQ*?t5>h8zJ2?K0n`+J{P;1$%9Se_ zu3o(g9^pmRkB9f4fnopA(+qc>e`Gj%`Xa;it5-#!su>yhq}f^6IiW=osDOsbP)ISd zaxnaOe}_SC#{mXg?r4U;;2;Gh4J3pAGc)|;c=c3PUhvWRLa`5RySE=0q@*Mn zjvYJ3;OOW?)KXQ5sh}-`OblEctPJeT|3q0Ov?>G?g8V+5TnauuR=^<(8W}Lvl+&Pv z4L?5IWsu&yg~5?Al;I!fAW$qzbV2pUUx6nlBqgOjGW};`VEF~wqlaWa>wg9YSy%I^ zduAL-iD1wa_`>iT94P`UoD71@zZrh~{e@h;AnC-;1U2`*{r$=y$F0I3${_()^!fK| zhW`wZ6XlT8%)kGC7zEg)8Qi2R8SZ>K$Y3lK#s2chh4n8~j>iiL2^^AUkOB{HFhP5` za09V1K<5NAGBL0+GckO7_d@j5=U>UMcyx=|4Fg5^gk%|*`6L;bxC9v3M3upN{y^(t zuo*+D7^pS&{pDo_x$XNHoEgKx{Sr`X3f&w~arOM$Z3bSG&qoaPoEU!o_|3oqTJMUk zP*Yvw!2!(+GoD;~TOqo6B9cV6VpF7R@UF3C7CdrL8AvO%!~}bzrGWA@a$F8Qx=8F zf5r(iJR%C zkUK$rvM;O;KS_wPZg_AXRJZ+QV7Yzk7Dx^SgFO0IL!x)pm5TvI|4lT$F#H3T_d<-{ z89x91z`)He0v-@U(S(HqY5;(S-VeUo#_;spLxxC&EQUPw28L<3`x!V`RT=(5n|hn+BDPQFM!rv;`%5#XRFfji8$?zXsX)}QP5y(X) zx*Le%gZdvJg`j>1GpGgmhvCn$#SA7F|1%izBr^PE0o941$Ob9G#6N%jU|^GbypK|6|2em-DeL~4Oy>iy5a&cwy={?}`UEl-y+Xz&>_n2Ojj zfHvj8I*5{-k_^wDE@P19(!pZ2W*7Em*WhcDvKGuGkk$AtHoa*fl7hT z-(NFu89tezsc!Y@_fODrNU%{1%!P%8;Qbb$IS6zN8k$y7RQhs(@%`nu$FD|O3Mw)m z{dkq(FS{;-2%9iU6Bsls!okeRaN^B=hRYvLF$BoOF^F?WgAW9NScM=#+o3s`SsBj0 zzr-NHsR=I1AhL|$v8~rX?l8#m7@|ZJL>@wd>XrvzPJo-m5D^F|&a2D7#Ky_+or8e^ zv~Q0QH1`S`Q-VmNkf5P+(CR_Z&^c($EdyxG2}K2j1I`Wijx)U9-OKR%-6IAjK?#O` zR}V69-?+x`@gt=E73bCj&-#JtOi*(jbS4bG?g29cC&Tq$>)x0I3TAPz@_YgnxuB_P z5N3{!js`F52hG4?#lLDY(jpaisEYOe$Xuxpm z(`5|b{(NQtP1k~E2tlh&Al^bHK^;v2HbI6vQf!2vDDZH&>A zhnVu80o1pV=P_k?`t=gS=ie{E{Sh^O2Zm6|HU_1~ObqOIuQPmnbd2HK-**guxi}gA zv$BI1JcAZEgXXe9G-#;(>!nTLky>_H$dojwl?Ik)W?}db!fb2|e|~;oc)28%;m6%$ z4Bzh@Vvv9Mlfm_cF@q_OKZ78LJcByFBZG~21~~D&_N{nwlKW32hx>w=i>9~iBlbb<6Kmd+eKvS6zkK!gl2Vh$HxX$dlHI2RIlfuNe zpZ7An7j$3%ZDnI+VqkY%!rz;rL`E(g9M4Z5j=RnTDWg6P3!FoUq6mH`{ zhTq@bF);r8&cOKVCj-ZizYH8NpEIyOdCc(f!&e5-W(&|Tg$AQ3gOs2d!}mWQ8B9bX z!NVZG{(cANbSW+!29Wz-{kY9=^3_7Hm^hav10Sn6ycA&i$HDNNclUWWJ*l~mA3S9M zIDT{xC2wOA1b^etn+L^_Nidv#&Q8%tc)ou75bku=VM3@FbNQ zuP#b`f!j0&@MM;$kS)XMx6>Ft{(8;8%?i3!^$!E6^&!fkf+KgpOoYrnGBGeSh;yog zTd$zDJ}9C=D*iJ3W?t!`@e9N2-{%+(K7(AD z0aDL$Xg!0%jb9ARfBrM@G6^#XF-tNCFp4p7FiA1+uzNFHl#*fC`@D}qOTdFcRnVE? z`=1Zs0ab959Ap3k19;pI~ajOf4?xi|9qN(?H>z+p+F$R*|#gfQ>s4V z)eOo!)(oJC1nCA%U;hJLwDJER1Ly#RuYcb$L@Lc>kmS~7`1$7(I5I%$uwl>uD+q(m z^_Al>W{}}FV0ioUKEsUCIQ4XFd3g?y2|*Mkt0>D0z6yD$0EQW%r4Hr&C16B>Y0Q3A)w+6RNjN?7f><=)g2(m zf}#nOnnCS!ZWeBaWe?^seEYA%@aNw*hEKm=FsSo8gDZEOjv-P4RLQb1u`~Sq_l4oc zhg}Tc|9)Z+Vv}P4)jy!|vJbzWFn~r2xR^ns5ugzR)YcKm-M|0;V7T^v2ZNz-2!ULS z+fktY)Q>-(875q@XZX+l<7=RQkOe0v=M`8}7g;AuR8$l)A1@m;Tmc@+{{R2QocVM1 zet!Jj+DO1!;M>2i3}60yV)*>$BLgcFJNRUuPru(YeEstoJmt&FD!?GhF2NwcF2cae z!VjKPXJcXm52b+2^O6o^C_b0L@Zj?e27O_F1~q<1yzU?*2?}IT(f94oJBC{y_c46_ z^O8Y`U7kUM-;IHTnHL<{KmL9K4`PB63aEdBZ5#^}nfE`P01w}Q>Nil4M96Mz^8f!b zGCcZo_-$Njc+!UtA8*FS#@+-iu)rE2K0ZF!%)luI3cx>q{(O7#^ob8Q7q{Nequ-Ca zhzD?e2lov?GoJsz!z!Q!4WPLZP^5tRA)w)Skmo@SfDgakf;)~NHmD`?>!z(+wu853 zgGw5#5dvC^gl-5vJ}5#!Ei=$X^cuSAmkwXs-lzOtw?>dxkO4H$j;xo9nU{fwg%3Qb z1=0s90zmR08su4!dQhr=P-_no5ujF% zDxU+m=mW`t>KV}7J+dA`Y*6HaT1=oRXFgU*aIPYx2UQ+)>NhvTlTTL|Bz$gFB&El% zzH#*qxQl_R4wc6O3Mf<|{5+6)5Vo|mWRQ}SVqlGD>D@PBbwKFfEFA_Wi1XV&(#DP;IpsHl zwtxw^Llr8Q#4znvC&TSe{~6TytQkPVB#81I)Er=7U}9ti*F&HHyZLc10|zr7gE*%K zgA|uGczPHV5!l>JirDXeKS9%~493C{Bp02m4BQNN-XCZ9q`9$3ijSusG?EJ{o)|&H z^8_5h0$MFdKn+%DnBkyhL=KJ)2R1+2(Rll&Mu(EH8rI8+K*RdXybM48 z{bGnwOk-Gbe=ft#Pk$NI`Ry70gN}Rvs|5{b|6zFd^C83i&&L@+^YWk;lO&fec;*ol zh+t(D5};fM>UD#1AgJykwzvbe>X`p?GCcl&ErWLO249(3_P|Nk-wun9B#0UZ*_z{C)zl*+LA z$!dl(uNN>}`>>ZmfK7_QKsc1)<@Xz4txCLB3_=_VkQ@OWq6bS*fdD18_dg#osPQ=x z-P8pYasU4QXSnop>C1nbXQH$Ol=p!yaU-?3BRhwn`ND28BYYZhIEc zP0d*5kkR$Q_@Eg+Py+zgS7BgaW(bgtVp#LYj^W;C$m!dl9N-~S1*!Bw3-!=Wrh}P9 z2@R@ye*F2w0Gg}N5O5_}kAaF)HbyRn&%a(Xoc%TPtf<+$P=0RF``^ET=5Y|CxWu{% zGEGISYCP&dWuy?d$mjcf7Xy0klpY50SwJiN@aRF7`tj!*186TIsD}*_2c;~~AvWAB zhzT@aHYo;PHfeA_2h^+vsiQUqrF2l;1R9qD)m8Y+2Q{%7|FJUM{Vc%ov#g^QXzw223bN&E@0X99vicvK}K$e20AGnx! z-o28#9Wdud7j%M^*uiSe!;-SA^>f6BQK|AWMF0FU|{~w z!SMOlD~97=C*8Xt-V?~K^3+94SmF|N(G?}ugY{B9LO`be|M#Ckm`Ci#XUP{~(|=d? zpMP_Lfs2V3Jn#sTN5`OflaIgOGk_LEfO;=5c~E%{TXYA?F;_pFV-V+*XGl`cVF;78 zVfg%WH^Z%un;D*byTKZx{cc{WIg-Nv@iNuTm$qMI?kaF#lu!|MxHHbpL5M@00o0iTov{Ks4g^%!fNov@MKq{5 z0@0WrV`KnLvVj)nz4>{ML5V!0?9Q>Z3nGkG8)2dugqhgz!Ew zX8!-6qip~E`Om<_1ThuUO!7o%6CqHyfW~W>{;)7e%1f+0@oK}_N3U;A^I=Q$ROQ!V z`1St>WT=G^bkXDw20m6n1{Nk3td~-P=HW%zB^mZS-@srh{23g0phyB)BgLu25U!xX z@cqwc@GjpQpRO}}`T3mT?$3`5j10UCf*gtroXi3YpkfU)yaH-yfQlxNUQkg9!k{tU z7eDSWEWH!Yz{1GEz{SS*iGlOW>0dn0E-=ZwJHgJ)w3DBc_w%opLJZ6d>J5D+AtUk+k;n@zxeSOycX>H-!BZH z^W|Uvc+K$o_j`uVzd;KTAVWN$5oZB5eg;kkE{5x05C8c3?=1s259d2x+bfPw9zVGy zCMLlkA}Gi3<;z#_sKh@i7ENg0gL7#fAuyXjtq&e1zP}98jLTmtUft4qAuZSLLtu%E zP>|rO?@z&J#Dh9yF!ks(s4g)UvSE1s{V~?o6)56Cn@WE{i*pGM1qNv@Rp>sHf8a<5 z^r*nK&3g`x>A8xW};b>xxq{hV1!eN@Y()ghl>~h=@D^?EnT<)PMf`#X6CM z?mlYq=@ua%2ZM?*hQEvqf?UF%Uy8kI+xu}(LlfSkwVVpE*BpI~B3#I_n@#J9UVc=mFWO)7k1;gd<=e`~K zvU&dpi6;{{q}cXJh)Det6%hrWQumXHYqnwLQk$l0guomR$}Nn4nHYq4h2Kiai&V1Q zVX*%C`J2d^KT{5=zcLQcU^Ntw;ZkN`WnlwvW(7sgUxvR7JWRX{ppGJFjs~i zpMT(?anPazd^r_lHZAdhL93J8PPpnw9+vw)h*ysZ4+ zMFqvLu(GjU`OE#4frbAkgRQCg#Tzp&7b!VQlwJA0f9vPZpE+GzT>d<}{PFjV8&?_3 zbj=wa-g?Bq&c@ClAtu8B>ZF3USP$k%0Qnn+8DRkd6BwljHUz-C8_!ytu`F5@rVnz8 Mr>mdKI;Vst09ar5X8-^I literal 0 HcmV?d00001 diff --git a/src/nsd/ims_allin1_corpa/vnf_config/IMS-ALLIN1_2p__1.yaml b/src/nsd/ims_allin1_corpa/vnf_config/IMS-ALLIN1_2p__1.yaml new file mode 100644 index 00000000..33c5ef96 --- /dev/null +++ b/src/nsd/ims_allin1_corpa/vnf_config/IMS-ALLIN1_2p__1.yaml @@ -0,0 +1,4 @@ +initial_config_primitive: +- name: config + parameter: + proxied_ip: diff --git a/src/vnfd/ims_allin1_2p_vnf/IMS-ALLIN1__vnfd.yaml b/src/vnfd/ims_allin1_2p_vnf/IMS-ALLIN1__vnfd.yaml new file mode 100644 index 00000000..b36941a9 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/IMS-ALLIN1__vnfd.yaml @@ -0,0 +1,85 @@ +vnfd:vnfd-catalog: + vnfd: + - id: IMS-ALLIN1_2p + name: IMS-ALLIN1_2p + short-name: IMS-ALLIN1_2p + description: IMS-ALLIN1_2p + logo: metaswitch_2x.png + mgmt-interface: + vdu-id: IMS-ALLIN1_2p-VM + vnf-configuration: + config-attributes: + config-delay: '0' + config-priority: '1' + config-primitive: + - name: config + parameter: + - name: home_domain + data-type: STRING + mandatory: 'true' + default-value: ims.com + - name: password + data-type: string + mandatory: 'true' + name: password + default-value: cw-aio + - name: create-update-user + parameter: + - name: number + data-type: STRING + mandatory: 'true' + - name: password + data-type: STRING + mandatory: 'true' + - name: delete-user + parameter: + - name: number + data-type: STRING + mandatory: 'true' + initial-config-primitive: + - name: config + parameter: + - name: proxied_ip + value: + seq: '1' + juju: + charm: clearwater-aio-proxy + connection-point: + - name: eth0 + type: VPORT + - name: eth1 + type: VPORT + vdu: + - id: IMS-ALLIN1_2p-VM + name: IMS-ALLIN1_2p-VM + description: IMS-ALLIN1_2p-VM + image: /mnt/powervault/virtualization/vnfs/demos/mwc2016/allin1.qcow2 + vm-flavor: + memory-mb: '4096' + storage-gb: '10' + vcpu-count: '2' + mgmt-vpci: 0000:00:0a.0 + external-interface: + - name: eth0 + virtual-interface: + bandwidth: '0' + type: VIRTIO + vpci: 0000:00:0a.0 + vnfd-connection-point-ref: eth0 + - name: eth1 + virtual-interface: + bandwidth: '0' + type: OM-MGMT + vpci: 0000:00:0b.0 + vnfd-connection-point-ref: eth1 + guest-epa: + cpu-pinning-policy: DEDICATED + cpu-thread-pinning-policy: PREFER + mempage-size: LARGE + numa-node-policy: + mem-policy: STRICT + node: + - id: '0' + paired-threads: + num-paired-threads: '1' + node-cnt: '1' diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/README.md b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/README.md new file mode 100644 index 00000000..c67a763b --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/README.md @@ -0,0 +1,53 @@ +# Overview + +This is a [Juju charm](https://jujucharms.com/about), which allows configuration of the [Project Clearwater](http://projectclearwater.org) IMS core's [all-in-one](http://clearwater.readthedocs.org/en/stable/All_in_one_Images/index.html) node. + +This is a proxy charm, meaning that you must spin up the all-in-one VM first, and then point this charm at it to manage it. + +Since the all-in-one node does not support scaling up, neither does this charm. + +# Deployment + +## Initial deployment + +The all-in-one VM image should be downloaded from [http://repo.cw-ngv.com/juju-clearwater-2/cw-aio.ova](http://repo.cw-ngv.com/juju-clearwater-2/cw-aio.ova) and deployed onto your virtualization platform. (You could alternatively try the latest all-in-one VM image from [http://vm-images.cw-ngv.com/](http://vm-images.cw-ngv.com/), but this may not have been tested with this charm - the juju-clearwater-2 version above is known to work.) + +The proxy charm should then be deployed, pointing at the all-in-one VM. + +# Using the All-in-One Node + +Once installed, the all-in-one node will listen for SIP traffic on port 5060 (both TCP and UDP). You can use a standard SIP client (e.g. Blink, Boghe or X-Lite) to register against the all-in-one VM's public IP and make calls. + +Our ["Making your first call" documentation](http://clearwater.readthedocs.org/en/latest/Making_your_first_call/index.html) has more information on this process. + +# Configuration + +- `proxied_ip`: The IP address of the All-in-One node to manage +- `password`: The login password of the All-in-One node to manage (default is + very likely correct) +- `home_domain`: The home domain for this service +- `base_number`: The first number to be allocated in the number range +- `number_count`: The count of numbers to allocate + +# Actions + +This proxy charm exposes two actions. + +- `create-update-user`: Creates a user, or updates if they already exist + - `number`: The number to provision + - `password`: The number's password + +- `delete-user`: Deletes a user + - `number`: The number to delete + +For example, `juju action do clearwater-aio-proxy/0 create-update-user number=\"1234567890\" password=secret` creates a user. (Note that the escaped double-quotes are required to avoid juju parsing the number as an integer rather than a string.) + +Note that the numbers specified in `create-update-user` and `delete-user` actions need not be in the number range specified in the configuration above. + +# Contact and Upstream Project Information + +Project Clearwater is an open-source IMS core, developed by [Metaswitch Networks](http://www.metaswitch.com) and released under the [GNU GPLv3](http://www.projectclearwater.org/download/license/). You can find more information about it on [our website](http://www.projectclearwater.org/) or [our documentation site](https://clearwater.readthedocs.org). + +Clearwater source code and issue list can be found at https://github.com/Metaswitch/. + +If you have problems when using Project Clearwater, read [our troubleshooting documentation](http://clearwater.readthedocs.org/en/latest/Troubleshooting_and_Recovery/index.html) for help, or see [our support page](http://clearwater.readthedocs.org/en/latest/Support/index.html) to find out how to ask mailing list questions or raise issues. diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions.yaml b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions.yaml new file mode 100644 index 00000000..424ae896 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions.yaml @@ -0,0 +1,19 @@ +create-update-user: + description: Create a user, or update a user if they already exist. + params: + number: + description: The number to provision + type: string + password: + description: The number's password + type: string + required: [number, password] + additionalProperties: false +delete-user: + description: Delete a user. If the user does not exist, this is still considered success. + params: + number: + description: The number to provision + type: string + required: [number] + additionalProperties: false diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/create-update-user b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/create-update-user new file mode 100755 index 00000000..1f388fe2 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/create-update-user @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +# Get the configuration and action parameters. +proxied_ip=$(config-get proxied_ip) +login_password=$(config-get password) +home_domain=$(config-get home_domain) +number=$(action-get number) +password=$(action-get password) + +if [ -z "$proxied_ip" ] || [ -z "$login_password" ] || [ -z "$home_domain" ] ; then + echo Proxy not yet configured! + exit 1 +fi + +# If the user doesn't exist, try to create them. Otherwise, try to update them. +if ! sshpass -p$login_password ssh -o StrictHostKeyChecking=no ubuntu@$proxied_ip "echo $login_password | sudo -S /usr/share/clearwater/bin/display_user $number $home_domain" ; then + echo "Subscriber doesn't exist - creating" + sshpass -p$login_password ssh -o StrictHostKeyChecking=no ubuntu@$proxied_ip "echo $login_password | sudo -S /usr/share/clearwater/bin/create_user $number $home_domain $password" +else + echo "Subscriber exists - updating" + sshpass -p$login_password ssh -o StrictHostKeyChecking=no ubuntu@$proxied_ip "echo $login_password | sudo -S /usr/share/clearwater/bin/update_user $number $home_domain --password $password" +fi diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/create-user b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/create-user new file mode 100755 index 00000000..feeb6466 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/create-user @@ -0,0 +1,17 @@ +#!/bin/bash +set -e + +# Get the configuration and action parameters. +proxied_ip=$(config-get proxied_ip) +login_password=$(config-get password) +home_domain=$(config-get home_domain) +number=$(action-get number) +password=$(action-get password) + +if [ -z "$proxied_ip" ] || [ -z "$login_password" ] || [ -z "$home_domain" ] ; then + echo Proxy not yet configured! + exit 1 +fi + +# Create the user. +sshpass -p$login_password ssh -o StrictHostKeyChecking=no ubuntu@$proxied_ip "echo $login_password | sudo -S /usr/share/clearwater/bin/create_user $number $home_domain $password" diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/delete-user b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/delete-user new file mode 100755 index 00000000..7ecf5198 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/actions/delete-user @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +# Get the configuration and action parameters. +proxied_ip=$(config-get proxied_ip) +login_password=$(config-get password) +home_domain=$(config-get home_domain) +number=$(action-get number) + +if [ -z "$proxied_ip" ] || [ -z "$login_password" ] || [ -z "$home_domain" ] ; then + echo Proxy not yet configured! + exit 1 +fi + +# Delete the user. +sshpass -p$login_password ssh -o StrictHostKeyChecking=no ubuntu@$proxied_ip "echo $login_password | sudo -S /usr/share/clearwater/bin/delete_user -y $number $home_domain" diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/config.yaml b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/config.yaml new file mode 100644 index 00000000..3be783fc --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/config.yaml @@ -0,0 +1,20 @@ +options: + proxied_ip: + description: The IP address of the All-in-One node to manage + type: string + password: + default: cw-aio + description: The login password of the All-in-One node to manage (default is very likely correct) + type: string + home_domain: + default: example.com + description: The home domain for this service + type: string + base_number: + default: "1230000000" + description: The first number to be allocated in the number range + type: string + number_count: + default: 1000 + description: The count of numbers to allocate + type: int diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/copyright b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/copyright new file mode 100644 index 00000000..39f1ec8f --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/copyright @@ -0,0 +1,31 @@ +Project Clearwater - IMS in the Cloud +Copyright (C) 2016 Metaswitch Networks Ltd + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation, either version 3 of the License, or (at your +option) any later version, along with the "Special Exception" for use of +the program along with SSL, set forth below. This program is distributed +in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. See the GNU General Public License for more +details. You should have received a copy of the GNU General Public +License along with this program. If not, see +. + +The author can be reached by email at clearwater@metaswitch.com or by +post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK + +Special Exception +Metaswitch Networks Ltd grants you permission to copy, modify, +propagate, and distribute a work formed by combining OpenSSL with The +Software, or a work derivative of such a combination, even if such +copying, modification, propagation, or distribution would otherwise +violate the terms of the GPL. You must comply with the GPL in all +respects for all of the code used other than OpenSSL. +"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL +Project and licensed under the OpenSSL Licenses, or a work based on such +software and licensed under the OpenSSL Licenses. +"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License +under which the OpenSSL Project distributes the OpenSSL toolkit software, +as those licenses appear in the file LICENSE-OPENSSL. diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/config-changed b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/config-changed new file mode 100755 index 00000000..4382edd6 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/config-changed @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +# Get the configuration. +proxied_ip=$(config-get proxied_ip) +login_password=$(config-get password) +home_domain=$(config-get home_domain) +base_number=$(config-get base_number) +number_count=$(config-get number_count) + +# If the node is configured, provision it and its numbers. +if [ -n "$proxied_ip" ] && [ -n "$home_domain" ] && [ -n "$login_password" ] ; then + # Copy the reconfigure-aio script on, and run it. + status-set maintenance "configuring" + sshpass -p$login_password scp -o StrictHostKeyChecking=no $CHARM_DIR/lib/reconfigure-aio ubuntu@$proxied_ip:/tmp/reconfigure-aio.$$ + sshpass -p$login_password ssh -o StrictHostKeyChecking=no ubuntu@$proxied_ip "echo $login_password | sudo -S bash -c 'bash /tmp/reconfigure-aio.$$ $home_domain $base_number $number_count ; rm -f /tmp/reconfigure-aio.$$'" + status-set active "configured" +else + status-set blocked "waiting for configuration" +fi diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/install b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/install new file mode 100755 index 00000000..4378d034 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/install @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +status-set maintenance "installing" + +# Install sshpass as we'll need it shortly +apt-get update +apt-get -q -y --force-yes install sshpass + +status-set maintenance "installed" diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/start b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/start new file mode 100755 index 00000000..8824f74a --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/start @@ -0,0 +1,7 @@ +#!/bin/bash +# Here put anything that is needed to start the service. +# Note that currently this is run directly after install +# i.e. 'service apache2 start' +set -e + +# Nothing to do diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/stop b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/stop new file mode 100755 index 00000000..f6ecbe3a --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/stop @@ -0,0 +1,10 @@ +#!/bin/bash +# This will be run when the service is being torn down, allowing you to disable +# it in various ways.. +# For example, if your web app uses a text file to signal to the load balancer +# that it is live... you could remove it and sleep for a bit to allow the load +# balancer to stop sending traffic. +# rm /srv/webroot/server-live.txt && sleep 30 +set -e + +# Nothing to do diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/upgrade-charm b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/upgrade-charm new file mode 100755 index 00000000..fdb1f864 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/hooks/upgrade-charm @@ -0,0 +1,8 @@ +#!/bin/bash +# This hook is executed each time a charm is upgraded after the new charm +# contents have been unpacked +# Best practice suggests you execute the hooks/install to ensure all updates are processed - +# hooks/config_change is triggered automatically +set -e + +$CHARM_DIR/hooks/install diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/icon.svg b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/icon.svg new file mode 100644 index 00000000..f9ac92c4 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/icon.svg @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/lib/reconfigure-aio b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/lib/reconfigure-aio new file mode 100755 index 00000000..a7cad909 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/lib/reconfigure-aio @@ -0,0 +1,55 @@ +#!/bin/bash +# Reconfigures an all-in-one image to use a new home domain and number range. +# Usage: reconfigure-aio [ ] + +# Get command-line arguments. +home_domain=$1 +base_number=$2 +number_count=$3 + +if [ -z "$home_domain" ] ; then + echo "Usage: reconfigure-aio [ ]" +fi + +# Remove all old numbers from the database, unless they're currently assigned. +# We do this even if the home domain hasn't changed, because the number range might have done (and +# it's hard to tell if that's happened, and cheap/low-impact to just do the reprovisioning). +old_home_domain=$(. /etc/clearwater/config ; echo $home_domain) +echo "DELETE FROM ellis.numbers WHERE number LIKE '%@$old_home_domain' AND owner_id IS NULL ;" | mysql + +# Update /etc/clearwater/shared_config, if the home domain has changed. +if [ "$home_domain" != "$old_home_domain" ] ; then + function escape { echo $1 | sed -e 's/\//\\\//g' ; } + sed -e 's/^home_domain=.*$/home_domain='$(escape $home_domain)'/g' \ + /tmp/shared_config.$$ + mv /tmp/shared_config.$$ /etc/clearwater/shared_config + + # Restart clearwater-infrastructure to propagate changes to other configuration files. + service clearwater-infrastructure restart +fi + +# Create new numbers in the new domain, if we've been asked to. +if [ -n "$base_number" ] && [ -n "$number_count" ] ; then + /usr/share/clearwater/ellis/env/bin/python /usr/share/clearwater/ellis/src/metaswitch/ellis/tools/create_numbers.py --start $base_number --count $number_count +fi + +# Restart all the components, if the home domain has changed. +if [ "$home_domain" != "$old_home_domain" ] ; then + # Work around https://github.com/Metaswitch/sprout/issues/1296. + service bono stop + + # Restart all the processes. + for X in /usr/share/clearwater/infrastructure/scripts/restart/* ; do $X ; done + + # Kick monit to wake up and sleep for 10 seconds to make sure it has an accurate view of the system. + monit + sleep 10 + + # Now wait until all the processes are back up and running (or at least "Uptime failed", which + # means the process is running, just hasn't been running for very long). + while monit summary | grep _process | egrep -v "(Running|Uptime failed)" ; do + echo Some processes still not running - waiting... + sleep 2 + done + echo All processes running - configuration complete! +fi diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/metadata.yaml b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/metadata.yaml new file mode 100644 index 00000000..4f1ad130 --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/metadata.yaml @@ -0,0 +1,10 @@ +name: clearwater-aio-proxy +summary: All-in-One proxy charm for Project Clearwater +maintainer: Project Clearwater Maintainers +description: All-in-One proxy charm for Project Clearwater +tags: + - misc +subordinate: false +provides: + ue: + interface: 3GPP-Gm diff --git a/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/revision b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/revision new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/src/vnfd/ims_allin1_2p_vnf/charms/clearwater-aio-proxy/revision @@ -0,0 +1 @@ +1 diff --git a/src/vnfd/ims_allin1_2p_vnf/icons/metaswitch_2x.png b/src/vnfd/ims_allin1_2p_vnf/icons/metaswitch_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a899bc8e3e45de8438181d86b9d9ae53b0e9f9dd GIT binary patch literal 2799 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 literal 0 HcmV?d00001 -- GitLab