diff --git a/config/simapp.yaml b/config/simapp.yaml index 6674134..39c58b4 100644 --- a/config/simapp.yaml +++ b/config/simapp.yaml @@ -7,6 +7,7 @@ configuration: info: description: SIMAPP initial local configuration version: 1.0.0 + http-version: 1 logger: APP: ReportCaller: false diff --git a/go.mod b/go.mod index b2b48fa..7b9911f 100644 --- a/go.mod +++ b/go.mod @@ -6,5 +6,6 @@ require ( github.com/free5gc/logger_util v1.0.0 github.com/fsnotify/fsnotify v1.4.9 github.com/spf13/viper v1.8.1 + golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 0fed820..9b2073d 100644 --- a/go.sum +++ b/go.sum @@ -114,7 +114,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= @@ -127,12 +126,12 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -153,6 +152,7 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +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/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -179,17 +179,20 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= @@ -230,7 +233,9 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +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= github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= @@ -247,8 +252,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -355,6 +360,7 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -413,7 +419,6 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201211090839-8ad439b19e0f h1:QdHQnPce6K4XQewki9WNbG5KOROuDzqO3NaYjI1cXJ0= golang.org/x/sys v0.0.0-20201211090839-8ad439b19e0f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -491,8 +496,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -593,13 +598,12 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= @@ -609,8 +613,8 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/simapp.go b/simapp.go index c31c81c..53b31fc 100644 --- a/simapp.go +++ b/simapp.go @@ -8,10 +8,13 @@ package main import ( "bytes" "crypto/sha1" + "crypto/tls" "encoding/hex" "encoding/json" "fmt" "io/ioutil" + "log" + "net" "net/http" "strconv" "strings" @@ -20,6 +23,7 @@ import ( "github.com/free5gc/logger_util" "github.com/fsnotify/fsnotify" "github.com/spf13/viper" + "golang.org/x/net/http2" "gopkg.in/yaml.v2" ) @@ -32,6 +36,7 @@ type Config struct { type Info struct { Version string `yaml:"version,omitempty"` Description string `yaml:"description,omitempty"` + HttpVersion int `yaml:"http-version,omitempty"` } type Configuration struct { @@ -186,30 +191,70 @@ type configMessage struct { msgOp int } +func (msg configMessage) String() string { + var msgType, msgOp string + switch msg.msgOp { + case add_op: + msgOp = "add_op" + case modify_op: + msgOp = "modify_op" + case delete_op: + msgOp = "delete_op" + } + + switch msg.msgType { + case device_group: + msgType = "device-group" + case network_slice: + msgType = "network-slice" + case subscriber: + msgType = "subscriber" + } + return fmt.Sprintf("Config msg name [%v], type [%v], op [%v]", msg.name, msgType, msgOp) +} + var SimappConfig Config var configMsgChan chan configMessage +var client *http.Client func InitConfigFactory(f string, configMsgChan chan configMessage, subProvisionEndpt *SubProvisionEndpt) error { - fmt.Println("Function called ", f) + log.Println("Function called ", f) if content, err := ioutil.ReadFile(f); err != nil { - fmt.Println("Readfile failed called ", err) + log.Println("Readfile failed called ", err) return err } else { SimappConfig = Config{} if yamlErr := yaml.Unmarshal(content, &SimappConfig); yamlErr != nil { - fmt.Println("yaml parsing failed ", yamlErr) + log.Println("yaml parsing failed ", yamlErr) return yamlErr } } if SimappConfig.Configuration == nil { - fmt.Println("Configuration Parsing Failed ", SimappConfig.Configuration) + log.Println("Configuration Parsing Failed ", SimappConfig.Configuration) return nil } - fmt.Println("Subscriber Provision Endpoint:") - fmt.Println("Address ", SimappConfig.Configuration.SubProvisionEndpt.Addr) - fmt.Println("Port ", SimappConfig.Configuration.SubProvisionEndpt.Port) + //set http client + if SimappConfig.Info.HttpVersion == 2 { + client = &http.Client{ + Transport: &http2.Transport{ + AllowHTTP: true, + DialTLS: func(network, addr string, _ *tls.Config) (net.Conn, error) { + return net.Dial(network, addr) + }, + }, + Timeout: 5 * time.Second, + } + } else { + client = &http.Client{ + Timeout: 5 * time.Second, + } + } + + log.Println("Subscriber Provision Endpoint:") + log.Println("Address ", SimappConfig.Configuration.SubProvisionEndpt.Addr) + log.Println("Port ", SimappConfig.Configuration.SubProvisionEndpt.Port) subProvisionEndpt.Addr = SimappConfig.Configuration.SubProvisionEndpt.Addr subProvisionEndpt.Port = SimappConfig.Configuration.SubProvisionEndpt.Port @@ -230,7 +275,7 @@ func syncConfig(w http.ResponseWriter, req *http.Request) { } func main() { - fmt.Println("SimApp started") + log.Println("SimApp started") configMsgChan = make(chan configMessage, 100) var subProvisionEndpt SubProvisionEndpt @@ -250,28 +295,64 @@ func main() { } } +func getNextBackoffInterval(retry, interval uint) uint { + mFactor := 1.5 + nextInterval := float64(retry*interval) * mFactor + + if nextInterval > 10 { + return 10 + } + + return uint(nextInterval) +} + +func sendHttpReqMsg(req *http.Request) (*http.Response, error) { + //Keep sending request to Http server until response is success + var retries uint = 0 + for { + rsp, err := client.Do(req) + retries = +1 + if err != nil { + nextInterval := getNextBackoffInterval(retries, 2) + log.Printf("http req send error [%v], retrying after %v sec...", err.Error(), nextInterval) + time.Sleep(time.Second * time.Duration(nextInterval)) + continue + } + + if rsp.StatusCode == http.StatusAccepted || + rsp.StatusCode == http.StatusOK || rsp.StatusCode == http.StatusNoContent { + log.Println("config push success") + return rsp, nil + } else { + nextInterval := getNextBackoffInterval(retries, 2) + log.Printf("http rsp error [%v], retrying after [%v] sec...", http.StatusText(rsp.StatusCode), nextInterval) + time.Sleep(time.Second * time.Duration(nextInterval)) + } + } +} + func sendMessage(msgChan chan configMessage, subProvisionEndpt SubProvisionEndpt) { var devGroupHttpend string var networkSliceHttpend string var subscriberHttpend string - fmt.Println("Subscriber Provision Endpoint in sendMessage:") - fmt.Println("Address ", subProvisionEndpt.Addr) - fmt.Println("Port ", subProvisionEndpt.Port) + log.Println("Subscriber Provision Endpoint in sendMessage:") + log.Println("Address ", subProvisionEndpt.Addr) + log.Println("Port ", subProvisionEndpt.Port) ip := strings.TrimSpace(subProvisionEndpt.Addr) - fmt.Println("webui running at ", ip) + log.Println("webui running at ", ip) devGroupHttpend = "http://" + ip + ":" + subProvisionEndpt.Port + "/config/v1/device-group/" - fmt.Println("device trigger http endpoint ", devGroupHttpend) + log.Println("device trigger http endpoint ", devGroupHttpend) networkSliceHttpend = "http://" + ip + ":" + subProvisionEndpt.Port + "/config/v1/network-slice/" - fmt.Println("network slice http endpoint ", devGroupHttpend) + log.Println("network slice http endpoint ", devGroupHttpend) subscriberHttpend = "http://" + ip + ":" + subProvisionEndpt.Port + "/api/subscriber/imsi-" - fmt.Println("subscriber http endpoint ", subscriberHttpend) + log.Println("subscriber http endpoint ", subscriberHttpend) for msg := range msgChan { var httpend string - fmt.Println("Received Message from Channel", msgChan, msg) + log.Println("Received Message from Channel", msgChan, msg) switch msg.msgType { case device_group: httpend = devGroupHttpend + msg.name @@ -283,32 +364,32 @@ func sendMessage(msgChan chan configMessage, subProvisionEndpt SubProvisionEndpt for { if msg.msgOp == add_op { - fmt.Println("Post Message to ", httpend) - client := &http.Client{Timeout: 5 * time.Second} + log.Printf("Post Message [%v] to %v", msg.String(), httpend) req, err := http.NewRequest(http.MethodPost, httpend, msg.msgPtr) - //resp, err := http.Post(httpend, "application/json", msg.msgPtr) - req.Header.Set("Content-Type", "application/json; charset=utf-8") - resp, err := client.Do(req) - fmt.Println("Post Message returned ", httpend) - //Handle Error if err != nil { fmt.Printf("An Error Occured %v", err) time.Sleep(1 * time.Second) continue } + + req.Header.Set("Content-Type", "application/json; charset=utf-8") + resp, err := sendHttpReqMsg(req) + if err != nil { + log.Printf("Post Message [%v] returned error [%v] ", httpend, err.Error()) + } + defer resp.Body.Close() //Read the response body _, err = ioutil.ReadAll(resp.Body) if err != nil { - fmt.Println(err) + log.Println(err) time.Sleep(1 * time.Second) continue } fmt.Printf("Message Post %v Success\n", httpend) } else if msg.msgOp == modify_op { - fmt.Println("PUT Message to ", httpend) - // initialize http client - client := &http.Client{Timeout: 5 * time.Second} + log.Printf("Put Message [%v] to %v", msg.String(), httpend) + req, err := http.NewRequest(http.MethodPut, httpend, msg.msgPtr) //Handle Error if err != nil { @@ -318,15 +399,15 @@ func sendMessage(msgChan chan configMessage, subProvisionEndpt SubProvisionEndpt } // set the request header Content-Type for json req.Header.Set("Content-Type", "application/json; charset=utf-8") - resp, err := client.Do(req) + resp, err := sendHttpReqMsg(req) if err != nil { - panic(err) + log.Printf("Put Message [%v] returned error [%v] ", httpend, err.Error()) } + fmt.Printf("Message PUT %v Success\n", resp.StatusCode) } else if msg.msgOp == delete_op { - fmt.Println("DELETE Message to ", httpend) - // initialize http client - client := &http.Client{Timeout: 5 * time.Second} + log.Printf("Delete Message [%v] to %v", msg.String(), httpend) + req, err := http.NewRequest(http.MethodDelete, httpend, msg.msgPtr) //Handle Error if err != nil { @@ -336,9 +417,9 @@ func sendMessage(msgChan chan configMessage, subProvisionEndpt SubProvisionEndpt } // set the request header Content-Type for json req.Header.Set("Content-Type", "application/json; charset=utf-8") - resp, err := client.Do(req) + resp, err := sendHttpReqMsg(req) if err != nil { - panic(err) + log.Printf("Delete Message [%v] returned error [%v] ", httpend, err.Error()) } fmt.Printf("Message DEL %v Success\n", resp.StatusCode) } @@ -350,23 +431,23 @@ func sendMessage(msgChan chan configMessage, subProvisionEndpt SubProvisionEndpt func compareSubscriber(subscriberNew *Subscriber, subscriberOld *Subscriber) bool { if subscriberNew.PlmnId != subscriberOld.PlmnId { - fmt.Println("Plmn ID changed.") + log.Println("Plmn ID changed.") return true } if subscriberNew.OPc != subscriberOld.OPc { - fmt.Println("OPc changed.") + log.Println("OPc changed.") return true } if subscriberNew.OP != subscriberOld.OP { - fmt.Println("OP changed.") + log.Println("OP changed.") return true } if subscriberNew.Key != subscriberOld.Key { - fmt.Println("Key changed.") + log.Println("Key changed.") return true } if subscriberNew.SequenceNumber != subscriberOld.SequenceNumber { - fmt.Println("SequenceNumber changed.") + log.Println("SequenceNumber changed.") return true } return false @@ -374,17 +455,17 @@ func compareSubscriber(subscriberNew *Subscriber, subscriberOld *Subscriber) boo func compareGroup(groupNew *DevGroup, groupOld *DevGroup) bool { if groupNew.IpDomainName != groupOld.IpDomainName { - fmt.Println("IP domain name changed.") + log.Println("IP domain name changed.") return true } if groupNew.SiteInfo != groupOld.SiteInfo { - fmt.Println("SIteInfo name changed.") + log.Println("SIteInfo name changed.") return true } if len(groupNew.Imsis) != len(groupOld.Imsis) { - fmt.Println("number of Imsis changed.") + log.Println("number of Imsis changed.") return true } var allimsiNew string @@ -405,7 +486,7 @@ func compareGroup(groupNew *DevGroup, groupOld *DevGroup) bool { bs2 := h2.Sum(nil) strcode2 := hex.EncodeToString(bs2[:]) - fmt.Println("CODE1 and CODE2 ", strcode1, strcode2) + log.Println("CODE1 and CODE2 ", strcode1, strcode2) if strcode2 != strcode1 { return true } @@ -442,15 +523,15 @@ func compareNetworkSlice(sliceNew *NetworkSlice, sliceOld *NetworkSlice) bool { qosNew := sliceNew.Qos qosOld := sliceOld.Qos if qosNew.Uplink != qosOld.Uplink { - fmt.Println("Uplink Rate changed ") + log.Println("Uplink Rate changed ") return true } if qosNew.Downlink != qosOld.Downlink { - fmt.Println("Downlink Rate changed ") + log.Println("Downlink Rate changed ") return true } if qosNew.TrafficClass != qosOld.TrafficClass { - fmt.Println("Traffic Class changed ") + log.Println("Traffic Class changed ") return true } for _, ng := range sliceNew.DevGroups { @@ -462,7 +543,7 @@ func compareNetworkSlice(sliceNew *NetworkSlice, sliceOld *NetworkSlice) bool { } } if found == false { - fmt.Println("new Dev Group added in slice ") + log.Println("new Dev Group added in slice ") return true // 2 network slices have some difference } } @@ -475,20 +556,20 @@ func compareNetworkSlice(sliceNew *NetworkSlice, sliceOld *NetworkSlice) bool { } } if found == false { - fmt.Println("Dev Group Deleted in slice ") + log.Println("Dev Group Deleted in slice ") return true // 2 network slices have some difference } } oldSite := sliceOld.SiteInfo newSite := sliceNew.SiteInfo if oldSite.SiteName != newSite.SiteName { - fmt.Println("site name changed ") + log.Println("site name changed ") return true } oldUpf := oldSite.Upf newUpf := newSite.Upf if (oldUpf.UpfName != newUpf.UpfName) && (oldUpf.UpfPort != newUpf.UpfPort) { - fmt.Println("Upf details changed") + log.Println("Upf details changed") return true } @@ -501,12 +582,12 @@ func compareNetworkSlice(sliceNew *NetworkSlice, sliceOld *NetworkSlice) bool { } } if found == false { - fmt.Println("gnb changed in slice ") + log.Println("gnb changed in slice ") return true // change in slice details } } - fmt.Println("No change in slices ") + log.Println("No change in slices ") return false } @@ -520,31 +601,31 @@ func UpdateConfig(f string) error { return yamlErr } if NewSimappConfig.Configuration == nil { - fmt.Println("Configuration Parsing Failed ", NewSimappConfig.Configuration) + log.Println("Configuration Parsing Failed ", NewSimappConfig.Configuration) return nil } - fmt.Println("Number of subscriber ranges in updated config", len(SimappConfig.Configuration.Subscriber)) + log.Println("Number of subscriber ranges in updated config", len(SimappConfig.Configuration.Subscriber)) var newImsiList []uint64 for o := 0; o < len(NewSimappConfig.Configuration.Subscriber); o++ { newSubscribers := NewSimappConfig.Configuration.Subscriber[o] - fmt.Println("Subscribers:") - fmt.Println(" UeIdStart", newSubscribers.UeIdStart) - fmt.Println(" UeIdEnd", newSubscribers.UeIdEnd) - fmt.Println(" PlmnId", newSubscribers.PlmnId) - fmt.Println(" OPc", newSubscribers.OPc) - fmt.Println(" OP", newSubscribers.OP) - fmt.Println(" Key", newSubscribers.Key) - fmt.Println(" SequenceNumber", newSubscribers.SequenceNumber) + log.Println("Subscribers:") + log.Println(" UeIdStart", newSubscribers.UeIdStart) + log.Println(" UeIdEnd", newSubscribers.UeIdEnd) + log.Println(" PlmnId", newSubscribers.PlmnId) + log.Println(" OPc", newSubscribers.OPc) + log.Println(" OP", newSubscribers.OP) + log.Println(" Key", newSubscribers.Key) + log.Println(" SequenceNumber", newSubscribers.SequenceNumber) newStart, err := strconv.ParseUint(newSubscribers.UeIdStart, 0, 64) if err != nil { - fmt.Println("error in ParseUint with UeIdStart", err) + log.Println("error in ParseUint with UeIdStart", err) continue } newEnd, err := strconv.ParseUint(newSubscribers.UeIdEnd, 0, 64) if err != nil { - fmt.Println("error in ParseUint with UeIdEnd", err) + log.Println("error in ParseUint with UeIdEnd", err) continue } for i := newStart; i <= newEnd; i++ { @@ -554,19 +635,19 @@ func UpdateConfig(f string) error { subscribers := SimappConfig.Configuration.Subscriber[s] start, err := strconv.ParseUint(subscribers.UeIdStart, 0, 64) if err != nil { - fmt.Println("error in ParseUint with UeIdStart", err) + log.Println("error in ParseUint with UeIdStart", err) continue } end, err := strconv.ParseUint(subscribers.UeIdEnd, 0, 64) if err != nil { - fmt.Println("error in ParseUint with UeIdEnd", err) + log.Println("error in ParseUint with UeIdEnd", err) continue } for j := start; j <= end; j++ { if i == j { // two subcribers' imsi are same found = true if compareSubscriber(newSubscribers, subscribers) == true { - fmt.Println("WARNING: subscriber provision not support modify yet!") + log.Println("WARNING: subscriber provision not support modify yet!") } break } @@ -578,13 +659,13 @@ func UpdateConfig(f string) error { // add subscriber to chan newSubscribers.UeId = strconv.FormatUint(i, 10) if err != nil { - fmt.Println("error in FormatUint with UeId", err) + log.Println("error in FormatUint with UeId", err) continue } b, err := json.Marshal(newSubscribers) if err != nil { - fmt.Println("error in marshal with newSubscriber", err) + log.Println("error in marshal with newSubscriber", err) continue } reqMsgBody := bytes.NewBuffer(b) @@ -601,12 +682,12 @@ func UpdateConfig(f string) error { subscribers := SimappConfig.Configuration.Subscriber[o] start, err := strconv.ParseUint(subscribers.UeIdStart, 0, 64) if err != nil { - fmt.Println("error in ParseUint with UeIdStart", err) + log.Println("error in ParseUint with UeIdStart", err) continue } end, err := strconv.ParseUint(subscribers.UeIdEnd, 0, 64) if err != nil { - fmt.Println("error in ParseUint with UeIdEnd", err) + log.Println("error in ParseUint with UeIdEnd", err) continue } for k := start; k <= end; k++ { @@ -617,10 +698,10 @@ func UpdateConfig(f string) error { } } if has == false { - fmt.Println("going to delete subscriber: ", k) + log.Println("going to delete subscriber: ", k) b, err := json.Marshal("") if err != nil { - fmt.Println("error in marshal with subscriber", err) + log.Println("error in marshal with subscriber", err) continue } reqMsgBody := bytes.NewBuffer(b) @@ -646,7 +727,7 @@ func UpdateConfig(f string) error { configChange := compareGroup(groupNew, groupOld) if configChange == true { // send Group Put - fmt.Println("Updated group config ", groupNew.Name) + log.Println("Updated group config ", groupNew.Name) dispatchGroup(configMsgChan, groupNew, modify_op) // find all slices which are using this device group and mark them modified for _, slice := range SimappConfig.Configuration.NetworkSlice { @@ -658,7 +739,7 @@ func UpdateConfig(f string) error { } } } else { - fmt.Println("Config not updated for group ", groupNew.Name) + log.Println("Config not updated for group ", groupNew.Name) } found = true groupOld.visited = true @@ -667,14 +748,14 @@ func UpdateConfig(f string) error { } if found == false { // new Group - Send Post - fmt.Println("New group config ", groupNew.Name) + log.Println("New group config ", groupNew.Name) dispatchGroup(configMsgChan, groupNew, add_op) } } // visit all groups see if slice is deleted...if found = false for _, group := range SimappConfig.Configuration.DevGroup { if group.visited == false { - fmt.Println("Group deleted ", group.Name) + log.Println("Group deleted ", group.Name) dispatchGroup(configMsgChan, group, delete_op) // find all slices which are using this device group and mark them modified for _, slice := range SimappConfig.Configuration.NetworkSlice { @@ -701,15 +782,15 @@ func UpdateConfig(f string) error { if sliceNew.Name == sliceOld.Name { configChange := compareNetworkSlice(sliceNew, sliceOld) if sliceOld.modified == true { - fmt.Println("Updated slice config ", sliceNew.Name) + log.Println("Updated slice config ", sliceNew.Name) sliceOld.modified = false dispatchNetworkSlice(configMsgChan, sliceNew, modify_op) } else if configChange == true { // send Slice Put - fmt.Println("Updated slice config ", sliceNew.Name) + log.Println("Updated slice config ", sliceNew.Name) dispatchNetworkSlice(configMsgChan, sliceNew, modify_op) } else { - fmt.Println("Config not updated for slice ", sliceNew.Name) + log.Println("Config not updated for slice ", sliceNew.Name) } found = true sliceOld.visited = true @@ -718,14 +799,14 @@ func UpdateConfig(f string) error { } if found == false { // new Slice - Send Post - fmt.Println("New slice config ", sliceNew.Name) + log.Println("New slice config ", sliceNew.Name) dispatchNetworkSlice(configMsgChan, sliceNew, add_op) } } // visit all sliceOld see if slice is deleted...if found = false for _, slice := range SimappConfig.Configuration.NetworkSlice { if slice.visited == false { - fmt.Println("Slice deleted ", slice.Name) + log.Println("Slice deleted ", slice.Name) dispatchNetworkSlice(configMsgChan, slice, delete_op) } } @@ -737,51 +818,51 @@ func UpdateConfig(f string) error { func WatchConfig() { viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event) { - fmt.Println("****Config file changed:", e.Name) + log.Println("****Config file changed:", e.Name) if err := UpdateConfig("config/simapp.yaml"); err != nil { - fmt.Println("error in loading updated configuration ", err) + log.Println("error in loading updated configuration ", err) } else { - fmt.Println("****Successfully updated configuration****") + log.Println("****Successfully updated configuration****") } }) - fmt.Println("WatchConfig done") + log.Println("WatchConfig done") } func dispatchAllSubscribers(configMsgChan chan configMessage) { - fmt.Println("Number of subscriber ranges", len(SimappConfig.Configuration.Subscriber)) + log.Println("Number of subscriber ranges", len(SimappConfig.Configuration.Subscriber)) for o := 0; o < len(SimappConfig.Configuration.Subscriber); o++ { subscribers := SimappConfig.Configuration.Subscriber[o] - fmt.Println("Subscribers:") - fmt.Println(" UeIdStart", subscribers.UeIdStart) - fmt.Println(" UeIdEnd", subscribers.UeIdEnd) - fmt.Println(" PlmnId", subscribers.PlmnId) - fmt.Println(" OPc", subscribers.OPc) - fmt.Println(" OP", subscribers.OP) - fmt.Println(" Key", subscribers.Key) - fmt.Println(" SequenceNumber", subscribers.SequenceNumber) + log.Println("Subscribers:") + log.Println(" UeIdStart", subscribers.UeIdStart) + log.Println(" UeIdEnd", subscribers.UeIdEnd) + log.Println(" PlmnId", subscribers.PlmnId) + log.Println(" OPc", subscribers.OPc) + log.Println(" OP", subscribers.OP) + log.Println(" Key", subscribers.Key) + log.Println(" SequenceNumber", subscribers.SequenceNumber) start, err := strconv.ParseUint(subscribers.UeIdStart, 0, 64) if err != nil { - fmt.Println("error in ParseUint with UeIdStart", err) + log.Println("error in ParseUint with UeIdStart", err) continue } end, err := strconv.ParseUint(subscribers.UeIdEnd, 0, 64) if err != nil { - fmt.Println("error in ParseUint with UeIdEnd", err) + log.Println("error in ParseUint with UeIdEnd", err) continue } for i := start; i <= end; i++ { subscribers.UeId = strconv.FormatUint(i, 10) - fmt.Println(" UeId", subscribers.UeId) + log.Println(" UeId", subscribers.UeId) if err != nil { - fmt.Println("error in FormatUint with UeId", err) + log.Println("error in FormatUint with UeId", err) continue } // subscribers.UeIdStart = "" // subscribers.UeIdEnd = "" b, err := json.Marshal(subscribers) if err != nil { - fmt.Println("error in marshal with subscribers", err) + log.Println("error in marshal with subscribers", err) continue } reqMsgBody := bytes.NewBuffer(b) @@ -796,28 +877,28 @@ func dispatchAllSubscribers(configMsgChan chan configMessage) { } func dispatchGroup(configMsgChan chan configMessage, group *DevGroup, msgOp int) { - fmt.Println("Group Name ", group.Name) - fmt.Println(" Site Name ", group.SiteInfo) - fmt.Println(" Imsis ", group.Imsis) + log.Println("Group Name ", group.Name) + log.Println(" Site Name ", group.SiteInfo) + log.Println(" Imsis ", group.Imsis) for im := 0; im < len(group.Imsis); im++ { - fmt.Println(" IMSI ", group.Imsis[im]) + log.Println(" IMSI ", group.Imsis[im]) } - fmt.Println(" IpDomainName ", group.IpDomainName) + log.Println(" IpDomainName ", group.IpDomainName) ipDomain := group.IpDomain if group.IpDomain != nil { - fmt.Println(" IpDomain Dnn ", ipDomain.Dnn) - fmt.Println(" IpDomain Dns Primary ", ipDomain.DnsPrimary) - fmt.Println(" IpDomain Mtu ", ipDomain.Mtu) - fmt.Println(" IpDomain UePool ", ipDomain.UePool) + log.Println(" IpDomain Dnn ", ipDomain.Dnn) + log.Println(" IpDomain Dns Primary ", ipDomain.DnsPrimary) + log.Println(" IpDomain Mtu ", ipDomain.Mtu) + log.Println(" IpDomain UePool ", ipDomain.UePool) } b, err := json.Marshal(group) if err != nil { - fmt.Println("error in marshal ", err) + log.Println("error in marshal ", err) return } reqMsgBody := bytes.NewBuffer(b) if SimappConfig.Configuration.ConfigSlice == false { - fmt.Println("Don't configure network slice ") + log.Println("Don't configure network slice ") return } var msg configMessage @@ -830,40 +911,40 @@ func dispatchGroup(configMsgChan chan configMessage, group *DevGroup, msgOp int) } func dispatchAllGroups(configMsgChan chan configMessage) { - fmt.Println("Number of device Groups ", len(SimappConfig.Configuration.DevGroup)) + log.Println("Number of device Groups ", len(SimappConfig.Configuration.DevGroup)) for _, group := range SimappConfig.Configuration.DevGroup { dispatchGroup(configMsgChan, group, add_op) } } func dispatchNetworkSlice(configMsgChan chan configMessage, slice *NetworkSlice, msgOp int) { - fmt.Println(" Slice Name : ", slice.Name) + log.Println(" Slice Name : ", slice.Name) fmt.Printf(" Slice sst %v, sd %v", slice.SliceId.Sst, slice.SliceId.Sd) - fmt.Println(" QoS information ", slice.Qos) - fmt.Println(" Slice site info ", slice.SiteInfo) + log.Println(" QoS information ", slice.Qos) + log.Println(" Slice site info ", slice.SiteInfo) site := slice.SiteInfo - fmt.Println(" Slice site name ", site.SiteName) - fmt.Println(" Slice gNB ", len(site.Gnb)) + log.Println(" Slice site name ", site.SiteName) + log.Println(" Slice gNB ", len(site.Gnb)) for e := 0; e < len(site.Gnb); e++ { fmt.Printf(" Slice gNB[%v] = %v \n", e, site.Gnb[e]) } - fmt.Println(" Slice Plmn ", site.Plmn) - fmt.Println(" Slice Upf ", site.Upf) + log.Println(" Slice Plmn ", site.Plmn) + log.Println(" Slice Upf ", site.Upf) - fmt.Println(" Slice Device Groups ", slice.DevGroups) + log.Println(" Slice Device Groups ", slice.DevGroups) for im := 0; im < len(slice.DevGroups); im++ { - fmt.Println(" Attached Device Groups ", slice.DevGroups[im]) + log.Println(" Attached Device Groups ", slice.DevGroups[im]) } b, err := json.Marshal(slice) if err != nil { - fmt.Println("error in marshal ", err) + log.Println("error in marshal ", err) return } reqMsgBody := bytes.NewBuffer(b) if SimappConfig.Configuration.ConfigSlice == false { - fmt.Println("Don't configure network slice ") + log.Println("Don't configure network slice ") return } var msg configMessage @@ -876,7 +957,7 @@ func dispatchNetworkSlice(configMsgChan chan configMessage, slice *NetworkSlice, } func dispatchAllNetworkSlices(configMsgChan chan configMessage) { - fmt.Println("Number of network Slices ", len(SimappConfig.Configuration.NetworkSlice)) + log.Println("Number of network Slices ", len(SimappConfig.Configuration.NetworkSlice)) for _, slice := range SimappConfig.Configuration.NetworkSlice { dispatchNetworkSlice(configMsgChan, slice, add_op) }