Add mep agent lib and sample app 70/3470/4
authorkhemendra kumar <khemendra.kumar@huawei.com>
Fri, 15 May 2020 19:24:24 +0000 (00:54 +0530)
committerGaurav Agrawal <gaurav.agrawal@huawei.com>
Sat, 16 May 2020 18:17:13 +0000 (18:17 +0000)
Change-Id: Idc007a38bde441c903d79bdb1312591dd0e02107

14 files changed:
mep/mepagent/README.md [new file with mode: 0644]
mep/mepagent/SampleApp/Dockerfile [new file with mode: 0644]
mep/mepagent/SampleApp/LICENSE [new file with mode: 0644]
mep/mepagent/SampleApp/README.md [new file with mode: 0644]
mep/mepagent/SampleApp/conf/app_instance_info.yaml [new file with mode: 0644]
mep/mepagent/SampleApp/go.mod [new file with mode: 0644]
mep/mepagent/SampleApp/go.sum [new file with mode: 0644]
mep/mepagent/SampleApp/mepagent.yaml [new file with mode: 0644]
mep/mepagent/SampleApp/src/main/main.go [new file with mode: 0644]
mep/mepagent/pkg/model/instance.go [new file with mode: 0644]
mep/mepagent/pkg/service/register.go [new file with mode: 0644]
mep/mepagent/pkg/service/util.go [new file with mode: 0644]
mep/mepagent/test/register_test.go [new file with mode: 0644]
mep/mepagent/test/util_test.go [new file with mode: 0644]

diff --git a/mep/mepagent/README.md b/mep/mepagent/README.md
new file mode 100644 (file)
index 0000000..b50520e
--- /dev/null
@@ -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 (file)
index 0000000..2568074
--- /dev/null
@@ -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 (file)
index 0000000..607e48e
--- /dev/null
@@ -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 (file)
index 0000000..f0a5238
--- /dev/null
@@ -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 (file)
index 0000000..37f764c
--- /dev/null
@@ -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 (file)
index 0000000..62785eb
--- /dev/null
@@ -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 (file)
index 0000000..2fa3f6f
--- /dev/null
@@ -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 (file)
index 0000000..79b7ef6
--- /dev/null
@@ -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 (file)
index 0000000..6c6fcee
--- /dev/null
@@ -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 (file)
index 0000000..66f4202
--- /dev/null
@@ -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 (file)
index 0000000..9341574
--- /dev/null
@@ -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 (file)
index 0000000..49313f4
--- /dev/null
@@ -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 (file)
index 0000000..2bababf
--- /dev/null
@@ -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 (file)
index 0000000..f8f9d87
--- /dev/null
@@ -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")
+       }
+}
+