From e6b0508c50f07c751a781f57265a4a5a016b6e71 Mon Sep 17 00:00:00 2001 From: khemendra kumar Date: Sat, 16 May 2020 00:54:24 +0530 Subject: [PATCH] Add mep agent lib and sample app Change-Id: Idc007a38bde441c903d79bdb1312591dd0e02107 --- mep/mepagent/README.md | 2 + mep/mepagent/SampleApp/Dockerfile | 40 ++++ mep/mepagent/SampleApp/LICENSE | 201 +++++++++++++++++++++ mep/mepagent/SampleApp/README.md | 17 ++ mep/mepagent/SampleApp/conf/app_instance_info.yaml | 63 +++++++ mep/mepagent/SampleApp/go.mod | 13 ++ mep/mepagent/SampleApp/go.sum | 29 +++ mep/mepagent/SampleApp/mepagent.yaml | 38 ++++ mep/mepagent/SampleApp/src/main/main.go | 25 +++ mep/mepagent/pkg/model/instance.go | 145 +++++++++++++++ mep/mepagent/pkg/service/register.go | 60 ++++++ mep/mepagent/pkg/service/util.go | 62 +++++++ mep/mepagent/test/register_test.go | 41 +++++ mep/mepagent/test/util_test.go | 96 ++++++++++ 14 files changed, 832 insertions(+) create mode 100644 mep/mepagent/README.md create mode 100644 mep/mepagent/SampleApp/Dockerfile create mode 100644 mep/mepagent/SampleApp/LICENSE create mode 100644 mep/mepagent/SampleApp/README.md create mode 100644 mep/mepagent/SampleApp/conf/app_instance_info.yaml create mode 100644 mep/mepagent/SampleApp/go.mod create mode 100644 mep/mepagent/SampleApp/go.sum create mode 100644 mep/mepagent/SampleApp/mepagent.yaml create mode 100644 mep/mepagent/SampleApp/src/main/main.go create mode 100644 mep/mepagent/pkg/model/instance.go create mode 100644 mep/mepagent/pkg/service/register.go create mode 100644 mep/mepagent/pkg/service/util.go create mode 100644 mep/mepagent/test/register_test.go create mode 100644 mep/mepagent/test/util_test.go diff --git a/mep/mepagent/README.md b/mep/mepagent/README.md new file mode 100644 index 0000000..b50520e --- /dev/null +++ b/mep/mepagent/README.md @@ -0,0 +1,2 @@ +# mep_agent_lib +Agent lib for mep service regsitration API diff --git a/mep/mepagent/SampleApp/Dockerfile b/mep/mepagent/SampleApp/Dockerfile new file mode 100644 index 0000000..2568074 --- /dev/null +++ b/mep/mepagent/SampleApp/Dockerfile @@ -0,0 +1,40 @@ +# Copyright 2020 Huawei Technologies Co., Ltd. +# +# 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. + + +FROM alpine:latest + +## CREATE APP USER ## +# Create the home directory for the new app user. +RUN mkdir -p /usr/app + +# Create an app user so our program doesn't run as root. +RUN apk update &&\ + apk add shadow &&\ + groupadd -r app &&\ + useradd -r -g app -d /usr/app -s /sbin/nologin -c "Docker image user" app + +# Set the home directory to our app user's home. +ENV HOME=/usr/app +ENV APP_HOME=/usr/app/ + +## SETTING UP THE APP ## +WORKDIR $APP_HOME + +# Copy in the application code. +COPY --chown=app:app . $APP_HOME +CMD ["./main"] + +# Change to the app user. +USER app diff --git a/mep/mepagent/SampleApp/LICENSE b/mep/mepagent/SampleApp/LICENSE new file mode 100644 index 0000000..607e48e --- /dev/null +++ b/mep/mepagent/SampleApp/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 Huawei Technologies Co., Ltd. + + 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. diff --git a/mep/mepagent/SampleApp/README.md b/mep/mepagent/SampleApp/README.md new file mode 100644 index 0000000..f0a5238 --- /dev/null +++ b/mep/mepagent/SampleApp/README.md @@ -0,0 +1,17 @@ +1. Download sample mep app: +git clone "ssh://gerrit.akraino.org:29418/ealt-edge" + ``` + +2. Build sampel mep app: + ``` + CGO_ENABLED=0 go build -a -ldflags '-extldflags "-static"' src/main/main.go + ``` + +3. Docker build: + +4. config file: + +5. run as pod: + + + diff --git a/mep/mepagent/SampleApp/conf/app_instance_info.yaml b/mep/mepagent/SampleApp/conf/app_instance_info.yaml new file mode 100644 index 0000000..37f764c --- /dev/null +++ b/mep/mepagent/SampleApp/conf/app_instance_info.yaml @@ -0,0 +1,63 @@ +# Copyright 2020 Huawei Technologies Co., Ltd. +# +# 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. + +--- +appInstanceId: id12345 +mepServerIP: 192.168.0.101 +mepServerPORT: 30088 +serviceInfoPosts: + - serName: ExampleService + serInstanceId: + serCategory: + href: "/example/catalogue1" + id: id12345 + name: RNI + version: version1 + version: ServiceVersion1 + state: ACTIVE + transportId: Rest1 + transportInfo: + id: TransId12345 + name: REST + description: REST API + type: REST_HTTP + protocol: HTTP + version: '2.0' + endpoint: + uris: + - http://ExampleService:30005 + implSpecificInfo: {} + serializer: JSON + scopeOfLocality: MEC_SYSTEM + consumedLocalOnly: false + isLocal: true +serAvailabilityNotificationSubscriptions: + - subscriptionType: SerAvailabilityNotificationSubscription + callbackReference: string + links: + self: + href: /mecSerMgmtApi/example + filteringCriteria: + serInstanceIds: + - ServiceInstance123 + serNames: + - ExampleService + serCategories: + - href: /example/catalogue1 + id: id12345 + name: RNI + version: version1 + states: + - ACTIVE + isLocal: true diff --git a/mep/mepagent/SampleApp/go.mod b/mep/mepagent/SampleApp/go.mod new file mode 100644 index 0000000..62785eb --- /dev/null +++ b/mep/mepagent/SampleApp/go.mod @@ -0,0 +1,13 @@ +module mep-agent + +go 1.14 + +require ( + github.com/agiledragon/gomonkey v2.0.1+incompatible + github.com/khemendra0/mep_agent_lib v0.0.0-20200514200710-1e480711e278 // indirect + github.com/khemendra0/mep_agent_lib_2 v0.0.0-20200515044354-e1f42901419d // indirect + github.com/khemendra0/mep_agent_lib_3 v0.0.0-20200515181745-facda354cc2a // indirect + github.com/khemendra0/mep_agent_lib_5 v0.0.0-20200515190552-685e7af625aa // indirect + github.com/smartystreets/goconvey v1.6.4 + gopkg.in/yaml.v2 v2.2.8 +) diff --git a/mep/mepagent/SampleApp/go.sum b/mep/mepagent/SampleApp/go.sum new file mode 100644 index 0000000..2fa3f6f --- /dev/null +++ b/mep/mepagent/SampleApp/go.sum @@ -0,0 +1,29 @@ +github.com/agiledragon/gomonkey v2.0.1+incompatible h1:DIQT3ZshgGz9pTwBddRSZWDutIRPx2d7UzmjzgWo9q0= +github.com/agiledragon/gomonkey v2.0.1+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/khemendra0/mep_agent_lib v0.0.0-20200514200710-1e480711e278 h1:OlJt5hf1vSwZDsL5Er+dq7gaZFWGsO9xEHPhDeUhj58= +github.com/khemendra0/mep_agent_lib v0.0.0-20200514200710-1e480711e278/go.mod h1:R3E+++9kes5yTa/FOTigCbgESB89fxkV3fSNgaIZ+aw= +github.com/khemendra0/mep_agent_lib v0.0.0-20200514203355-fdf3ccdf5332 h1:u5H6Sng3lcaFDHGkS9oCpKYj4vg0KkQem3DwLIRa+Uk= +github.com/khemendra0/mep_agent_lib_2 v0.0.0-20200515044354-e1f42901419d h1:h4OImiHv7jng9JN7NENbHzMBZiqdKCyfOHrn8HB9lUo= +github.com/khemendra0/mep_agent_lib_2 v0.0.0-20200515044354-e1f42901419d/go.mod h1:cLt2kf1jVHS7gmHMHSFzGtWlD5ac16rMfsObbkY2RlU= +github.com/khemendra0/mep_agent_lib_3 v0.0.0-20200515181745-facda354cc2a h1:wvynPYD+6o9LMSkqFv4lDOseaOL91G50XTj4vdD4Ws8= +github.com/khemendra0/mep_agent_lib_3 v0.0.0-20200515181745-facda354cc2a/go.mod h1:BFDUBKoOuzZLmkOLHUv3GODCPbgd6jhJNruFLganZJI= +github.com/khemendra0/mep_agent_lib_4 v0.0.0-20200515185547-0c783f20e651 h1:wi75k+JXOA1K5H4s+GKIox6c0RPSfQ9VP7j2vJ2044M= +github.com/khemendra0/mep_agent_lib_5 v0.0.0-20200515190552-685e7af625aa h1:aKmYnfBgLdJ+fKS3MHE0ig8UiJuTdMqohCaas8hN/r4= +github.com/khemendra0/mep_agent_lib_5 v0.0.0-20200515190552-685e7af625aa/go.mod h1:Z90GKwOZ8xQuY9eLUKrgt5TvVBVQZbNRSzsbvbYCCmQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/mep/mepagent/SampleApp/mepagent.yaml b/mep/mepagent/SampleApp/mepagent.yaml new file mode 100644 index 0000000..79b7ef6 --- /dev/null +++ b/mep/mepagent/SampleApp/mepagent.yaml @@ -0,0 +1,38 @@ +# Copyright 2020 Huawei Technologies Co., Ltd. +# +# 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. + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mepagent + namespace: mep +spec: + replicas: 1 + selector: + matchLabels: + app: mepagent + template: + metadata: + labels: + app: mepagent + spec: + containers: + - + image: "mepagent:latest" + imagePullPolicy: IfNotPresent + name: mepagent + ports: + - + containerPort: 80 diff --git a/mep/mepagent/SampleApp/src/main/main.go b/mep/mepagent/SampleApp/src/main/main.go new file mode 100644 index 0000000..6c6fcee --- /dev/null +++ b/mep/mepagent/SampleApp/src/main/main.go @@ -0,0 +1,25 @@ +/* + * Copyright 2020 Huawei Technologies Co., Ltd. + * + * 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. + */ + +package main + +import ( + "github.com/akraino-edge-stack/ealt-edge/mep/mepagent/pkg/service" +) + +func main() { + _, _ = service.SvcReg("./conf/app_instance_info.yaml") +} diff --git a/mep/mepagent/pkg/model/instance.go b/mep/mepagent/pkg/model/instance.go new file mode 100644 index 0000000..66f4202 --- /dev/null +++ b/mep/mepagent/pkg/model/instance.go @@ -0,0 +1,145 @@ +/* + * Copyright 2020 Huawei Technologies Co., Ltd. + * + * 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. + */ + +// define the type information +package model + +type AppInstanceInfo struct { + AppInstanceId string `yaml:"appInstanceId" json:"appInstanceId"` + MepServerIP string `yaml:"mepServerIP" json:"mepServerIP"` + MepServerPORT string `yaml:"mepServerPORT" json:"mepServerPORT"` + ServiceInfoPosts []ServiceInfoPost `yaml:"serviceInfoPosts" json:"serviceInfoPosts"` + SerAvailabilityNotificationSubscriptions []SerAvailabilityNotificationSubscription `yaml:"serAvailabilityNotificationSubscriptions" json:"serAvailabilityNotificationSubscriptions"` +} + +type ServiceInfoPost struct { + SerInstanceId string `yaml:"serInstanceId" json:"serInstanceId"` + SerName string `yaml:"serName" json:"serName"` + SerCategory CategoryRef `yaml:"serCategory" json:"serCategory"` + Version string `yaml:"version" json:"version"` + State ServiceState `yaml:"state" json:"state"` + TransportId string `yaml:"transportId" json:"transportId"` + TransportInfo TransportInfo `yaml:"transportInfo" json:"transportInfo"` + Serializer SerializerType `yaml:"serializer" json:"serializer"` + ScopeOfLocality LocalityType `yaml:"scopeOfLocality" json:"scopeOfLocality"` + ConsumedLocalOnly bool `yaml:"consumedLocalOnly" json:"consumedLocalOnly"` + IsLocal bool `yaml:"isLocal" json:"isLocal"` +} + +type CategoryRef struct { + Href string `yaml:"href" json:"href"` + Id string `yaml:"id" json:"id"` + Name string `yaml:"name" json:"name"` + Version string `yaml:"version" json:"version"` +} + +type ServiceState string + +const ( + ACTIVE ServiceState = "ACTIVE" + INACTIVE ServiceState = "INACTIVE" +) + +type TransportInfo struct { + Id string `yaml:"id" json:"id"` + Name string `yaml:"name" json:"name"` + Description string `yaml:"description" json:"description"` + TransportType TransportType `yaml:"type" json:"type"` + Protocol string `yaml:"protocol" json:"protocol"` + Version string `yaml:"version" json:"version"` + Endpoint EndPointInfoUris `yaml:"endpoint" json:"endpoint"` + Security SecurityInfo `yaml:"security" json:"security"` + ImplSpecificInfo ImplSpecificInfo `yaml:"implSpecificInfo" json:"implSpecificInfo"` +} + +type TransportType string + +const ( + REST_HTTP TransportType = "REST_HTTP" + MB_TOPIC_BASED TransportType = "MB_TOPIC_BASED" + MB_ROUTING TransportType = "MB_ROUTING" + MB_PUBSUB TransportType = "MB_PUBSUB" + RPC TransportType = "RPC" + RPC_STREAMING TransportType = "RPC_STREAMING" + WEBSOCKET TransportType = "WEBSOCKET" +) + +type EndPointInfoUris struct { + Uris []string `yaml:"uris" json:"uris"` +} + +type SecurityInfo struct { + OAuth2Info SecurityInfoOAuth2Info `yaml:"oAuth2Info" json:"oAuth2Info"` +} + +type SecurityInfoOAuth2Info struct { + GrantTypes []SecurityInfoOAuth2InfoGrantType `yaml:"grantTypes" json:"grantTypes"` + TokenEndpoint string `yaml:"tokenEndpoint" json:"tokenEndpoint"` +} + +type SecurityInfoOAuth2InfoGrantType string + +const ( + AUTHORIZATION_CODE SecurityInfoOAuth2InfoGrantType = "OAUTH2_AUTHORIZATION_CODE" + IMPLICIT_GRANT SecurityInfoOAuth2InfoGrantType = "OAUTH2_IMPLICIT_GRANT" + RESOURCE_OWNER SecurityInfoOAuth2InfoGrantType = "OAUTH2_RESOURCE_OWNER" + CLIENT_CREDENTIALS SecurityInfoOAuth2InfoGrantType = "OAUTH2_CLIENT_CREDENTIALS" +) + +type ImplSpecificInfo struct { +} + +type SerializerType string + +const ( + JSON SerializerType = "JSON" + XML SerializerType = "XML" + PROTOBUF3 SerializerType = "PROTOBUF3" +) + +type LocalityType string + +const ( + MEC_SYSTEM LocalityType = "MEC_SYSTEM" + MEC_HOST LocalityType = "MEC_HOST" + NFVI_POP LocalityType = "NFVI_POP" + ZONE LocalityType = "ZONE" + ZONE_GROUP LocalityType = "ZONE_GROUP" + NFVI_NODE LocalityType = "NFVI_NODE" +) + +type SerAvailabilityNotificationSubscription struct { + SubscriptionType string `yaml:"subscriptionType" json:"subscriptionType"` + CallbackReference string `yaml:"callbackReference" json:"callbackReference"` + Links Self `yaml:"links" json:"links"` + FilteringCriteria SerAvailabilityNotificationSubscriptionFilteringCriteria `yaml:"filteringCriteria" json:"filteringCriteria"` +} + +type Self struct { + Self LinkType `yaml:"self" json:"self"` +} + +type LinkType struct { + Href string `yaml:"href" json:"href"` +} + +type SerAvailabilityNotificationSubscriptionFilteringCriteria struct { + SerInstanceIds []string `yaml:"serInstanceIds" json:"serInstanceIds"` + SerNames []string `yaml:"serNames" json:"serNames"` + SerCategories []CategoryRef `yaml:"serCategories" json:"serCategories"` + States []ServiceState `yaml:"states" json:"states"` + IsLocal bool `yaml:"isLocal" json:"isLocal"` +} diff --git a/mep/mepagent/pkg/service/register.go b/mep/mepagent/pkg/service/register.go new file mode 100644 index 0000000..9341574 --- /dev/null +++ b/mep/mepagent/pkg/service/register.go @@ -0,0 +1,60 @@ +/* + * Copyright 2020 Huawei Technologies Co., Ltd. + * + * 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. + */ + +package service + +import ( + "encoding/json" + "log" + "strconv" + "time" +) + +func SvcReg(confPath string) (string, error) { + conf, err := GetConf(confPath) + if err != nil { + log.Println(err.Error()) + return "", err + } + + appInstanceId := conf.AppInstanceId + serviceInfos := conf.ServiceInfoPosts + mepServerIP := conf.MepServerIP + mepServerPORT := conf.MepServerPORT + url := "http://" + mepServerIP + ":" + mepServerPORT + "/mep/mec_service_mgmt/v1/applications/" + appInstanceId + "/services" + + for _, serviceInfo := range serviceInfos { + data, e := json.Marshal(serviceInfo) + if e != nil { + log.Println("Failed to marshal service info to object") + continue + } + + for i := 1; i <= 5; i++ { // if register failed, then retry five times + _, err := RegisterToMep(string(data), url) + if err != nil { + log.Println("Failed to register to mep, appInstanceId is" + appInstanceId + ", serviceName is " + serviceInfo.SerName) + } else { + log.Println("Register mep main to mep success, appInstanceId is" + appInstanceId + ", serviceName is " + serviceInfo.SerName) + break + } + log.Println("Failed to register mep main to mep, will retry 5 times, retry interval is 30 s, already retry " + strconv.Itoa(i) + " time") + time.Sleep(30 * time.Second) // register failed , 30 seconds after try again + } + } + + return "", nil +} diff --git a/mep/mepagent/pkg/service/util.go b/mep/mepagent/pkg/service/util.go new file mode 100644 index 0000000..49313f4 --- /dev/null +++ b/mep/mepagent/pkg/service/util.go @@ -0,0 +1,62 @@ +/* + * Copyright 2020 Huawei Technologies Co., Ltd. + * + * 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. + */ + +package service + +import ( + "errors" + "gopkg.in/yaml.v2" + "io/ioutil" + "net/http" + "strings" + "github.com/akraino-edge-stack/ealt-edge/mep/mepagent/pkg/model" +) + +// get yaml and parse to struct +func GetConf(path string) (model.AppInstanceInfo, error) { + yamlFile, err := ioutil.ReadFile(path) + var info model.AppInstanceInfo + if err != nil { + return info, err + } + + err = yaml.UnmarshalStrict(yamlFile, &info) + + if err != nil { + return info, err + } + + return info, nil +} + +// register to mep +func RegisterToMep(param string, url string) (string, error) { + response, err := http.Post(url, "application/json", strings.NewReader(param)) + if err != nil { + return "", err + } + + if response.StatusCode != http.StatusCreated { + return "", errors.New("created failed") + } + defer response.Body.Close() + body, err2 := ioutil.ReadAll(response.Body) + if err2 != nil { + return "", err2 + } + + return string(body), nil +} diff --git a/mep/mepagent/test/register_test.go b/mep/mepagent/test/register_test.go new file mode 100644 index 0000000..2bababf --- /dev/null +++ b/mep/mepagent/test/register_test.go @@ -0,0 +1,41 @@ +/* + * Copyright 2020 Huawei Technologies Co., Ltd. + * + * 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. + */ + +package test + +import ( + "github.com/agiledragon/gomonkey" + "github.com/smartystreets/goconvey/convey" + "pkg/service" + "testing" +) + +func TestStartSuccess(t *testing.T) { + + convey.Convey("RegisterToMepTest", t, func() { + patch := gomonkey.ApplyFunc(service.RegisterToMep, func(param string, url string) (string, error) { + return "", nil + }) + + _, err := service.SvcReg("../../conf/app_instance_info.yaml") + if err != nil { + t.Error("error") + } + defer patch.Reset() + + }) + +} diff --git a/mep/mepagent/test/util_test.go b/mep/mepagent/test/util_test.go new file mode 100644 index 0000000..f8f9d87 --- /dev/null +++ b/mep/mepagent/test/util_test.go @@ -0,0 +1,96 @@ +/* + * Copyright 2020 Huawei Technologies Co., Ltd. + * + * 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. + */ + +package test + +import ( + "encoding/json" + "pkg/service" + "net/http" + "net/http/httptest" + "testing" +) + +func TestGetConfSuccess(t *testing.T) { + _, err := service.GetConf("../../conf/app_instance_info.yaml") + if err != nil { + t.Error("Read conf file failed") + } +} + +func TestGetConfFail(t *testing.T) { + _, err := service.GetConf("../conf/app_instance_info.yaml") + if err == nil { + t.Error("Read conf file failed") + } +} + +func TestRegisterToMepSuccess(t *testing.T) { + httpResponse := "response body" + var httpResponseBytes, err1 = json.Marshal(httpResponse) + if err1 != nil { + t.Error("Marshal http Response Error") + } + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusCreated) + _, err2 := w.Write(httpResponseBytes) + + if err2 != nil { + t.Error("Write Response Error") + } + if r.Method != "POST" { + t.Error("UnExcepted Method") + } + })) + + defer ts.Close() + api := ts.URL + + _, err := service.RegisterToMep("param", api) + if err != nil { + t.Error("error") + } +} + +func TestRegisterToMepFail1(t *testing.T) { + httpResponse := "response body" + var httpResponseBytes, err1 = json.Marshal(httpResponse) + if err1 != nil { + t.Error("Marshal http Response Error") + } + + ts2 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusBadRequest) + _, err2 := w.Write(httpResponseBytes) + + if err2 != nil { + t.Error("Write Response Error") + } + if r.Method != "POST" { + t.Error("UnExcepted Method") + } + })) + + defer ts2.Close() + api := ts2.URL + + _, err := service.RegisterToMep("param", api) + if err == nil { + t.Error("error") + } +} + -- 2.16.6