diff --git a/configs/clients.toml b/configs/clients.toml index 55587b67e38a2e99c7b8de177075aa628ac0f818..ef551bf2ed1f85fb42a152bea10da5586c48726a 100644 --- a/configs/clients.toml +++ b/configs/clients.toml @@ -1,3 +1,5 @@ [[client]] identifier = "ciena-mcp" endpoint = "172.17.0.3:8080" +gjsonDefaultPath = "data.#.object_data.tapi-object-data" +gjsonConnectionsPath = "data.#.object_data" diff --git a/go.mod b/go.mod index 6931f95e021929526f4576020753dd1b053ed534..dd79e0b9f60580331c8fb96e184c765d554ff432 100644 --- a/go.mod +++ b/go.mod @@ -4,18 +4,19 @@ go 1.14 require ( code.fbi.h-da.de/cocsn/swagger/apis v0.0.0-20200924152423-61030cab7b88 + code.fbi.h-da.de/cocsn/yang-modules/generated/tapi v0.0.0-20201116134549-765aa1790752 github.com/BurntSushi/toml v0.3.1 github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591 github.com/go-openapi/runtime v0.19.22 github.com/go-openapi/strfmt v0.19.5 github.com/golang/protobuf v1.4.2 - github.com/google/go-cmp v0.4.1 // indirect github.com/neo4j/neo4j-go-driver v1.8.3 github.com/onsi/ginkgo v1.13.0 // indirect + github.com/openconfig/ygot v0.8.7 github.com/rivo/tview v0.0.0-20201018122409-d551c850a743 + github.com/tidwall/gjson v1.6.3 github.com/sirupsen/logrus v1.4.2 golang.org/x/net v0.0.0-20200904194848-62affa334b73 // indirect - google.golang.org/genproto v0.0.0-20200519141106-08726f379972 // indirect google.golang.org/grpc v1.29.1 google.golang.org/protobuf v1.23.0 ) diff --git a/go.sum b/go.sum index 068b336d320d5cb2c04c2980060b37ad15813906..6b90cf7a5ba559555977fa50e1c30c224c7bb174 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= code.fbi.h-da.de/cocsn/swagger/apis v0.0.0-20200924152423-61030cab7b88 h1:cNqY3WEh+CX8+esxIwWU/uD7hRC5mPvuJmXzB07OeuA= code.fbi.h-da.de/cocsn/swagger/apis v0.0.0-20200924152423-61030cab7b88/go.mod h1:3jDZAOmepPl3kiukNGvPFkJEzgGczgrC3zJ2jcqVFSs= +code.fbi.h-da.de/cocsn/yang-modules/generated/tapi v0.0.0-20201116134549-765aa1790752 h1:hCeie9cCBt0gyETD0EAINuWqpEokf0ulP1Rv9F+rXB0= +code.fbi.h-da.de/cocsn/yang-modules/generated/tapi v0.0.0-20201116134549-765aa1790752/go.mod h1:EhCu5gVeMKHpjwoV5g5eycc7WcfU98jkPswLDRHQX5w= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -15,6 +17,7 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -155,6 +158,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/protobuf v3.11.4+incompatible/go.mod h1:lUQ9D1ePzbH2PrIS7ob/bjm9HXyH5WHB0Akwh7URreM= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -175,6 +179,8 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -209,6 +215,17 @@ github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/openconfig/gnmi v0.0.0-20200414194230-1597cc0f2600/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A= +github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be h1:VEK8utxoyZu/hkpjLxvuBmK5yW3NmBo/v/Wu5VQAJVs= +github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A= +github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0JgHJzdrHi2l+w0fZrwArtXL7jEFoiqLEdmkvU= +github.com/openconfig/goyang v0.0.0-20200616001533-c0659aea65dd/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8= +github.com/openconfig/goyang v0.0.0-20200917201611-633eccb6fa97 h1:TaCuNSX/fiTuky8ouzC+JaCJN+OSOpjtYlLrn/uXxxE= +github.com/openconfig/goyang v0.0.0-20200917201611-633eccb6fa97/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8= +github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs= +github.com/openconfig/ygot v0.8.7 h1:BKErV6vM15YGM1+XHDuLAQ938dYahzSgwlt9BIGFrdY= +github.com/openconfig/ygot v0.8.7/go.mod h1:AqXe0HNEITTcmcYkr+yzDMY8ofitImUdfZV4IgRsJWU= +github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -241,8 +258,14 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 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/tidwall/gjson v1.6.3 h1:aHoiiem0dr7GHkW001T1SMTJ7X5PvyekH5WX0whWGnI= +github.com/tidwall/gjson v1.6.3/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0= +github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU= +github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= @@ -258,6 +281,7 @@ golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaE golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -274,7 +298,9 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= @@ -339,6 +365,7 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/nucleus/interfaces/clientConfig.go b/nucleus/interfaces/clientConfig.go index 5a2782e10fb6503eabff8db25aec83af35ac1960..b90df804102925a958eea25977486e275ebd48c3 100644 --- a/nucleus/interfaces/clientConfig.go +++ b/nucleus/interfaces/clientConfig.go @@ -3,8 +3,10 @@ package interfaces // ClientConfig contains SBI client // configuration parameters type ClientConfig struct { - Identifier string `toml:"identifier"` - Endpoint string `toml:"endpoint"` - Username string `toml:"username"` - Password string `toml:"password"` + Identifier string `toml:"identifier"` + Endpoint string `toml:"endpoint"` + Username string `toml:"username"` + Password string `toml:"password"` + GjsonDefaultPath string `toml:"gjsonDefaultPath"` + GjsonConnectionsPath string `toml:"gjsonConnectionsPath"` } diff --git a/sbi/restconf/client/ciena/client.go b/sbi/restconf/client/ciena/client.go index 6ca23972c29f3a41470f4c2e484ab12145cd7fcc..7b994496a17a145ce2b6ed5c207e0fb55b8b8435 100644 --- a/sbi/restconf/client/ciena/client.go +++ b/sbi/restconf/client/ciena/client.go @@ -6,12 +6,17 @@ import ( "code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces" "code.fbi.h-da.de/cocsn/gosdn/sbi/restconf/util" apiclient "code.fbi.h-da.de/cocsn/swagger/apis/mcp/client" + "code.fbi.h-da.de/cocsn/yang-modules/generated/tapi" "crypto/tls" + "encoding/json" "github.com/go-openapi/runtime" httptransport "github.com/go-openapi/runtime/client" "github.com/go-openapi/strfmt" + "github.com/openconfig/ygot/ygot" + "github.com/tidwall/gjson" log "github.com/sirupsen/logrus" "net/http" + "strings" ) //MCPClient handles requests to a Ciena MCP RESTCONF endpoint @@ -21,6 +26,7 @@ type MCPClient struct { database *database.Database buffer *bytes.Buffer config *interfaces.ClientConfig + device ygot.GoStruct } // GetConfig returns a ClientConfig struct containing @@ -49,6 +55,7 @@ func NewMCPClient(endpoint, username, password string, database *database.Databa database: database, buffer: buffer, config: config, + device: &tapi.Device{}, } } @@ -57,8 +64,25 @@ func NewMCPClient(endpoint, username, password string, database *database.Databa func (c *MCPClient) GetConnections() error { defer c.buffer.Reset() _, err := c.client.TapiConnectivityCore.GetTapiCoreContextConnection(nil) - c.database.StoreConnections(c.buffer.String()) - log.Debug(c.buffer.Next(25)) + if err != nil { + return err + } + + json := preformatJSON(c.buffer.String(), c.config.GjsonConnectionsPath) + + for _, jsonEntry := range json.Array() { + dest := &tapi.TapiCommon_Context_ConnectivityContext_Connection{} + if err := tapi.Unmarshal([]byte(jsonEntry.String()), dest); err != nil { + //TODO: think about a way how to handle this. + //logging every error is kinda ugly, since ciena tapi throws a + //lot of them. + log.Info(err) + } + log.Info(*dest.Uuid) + } + + // c.database.StoreConnections(c.buffer.String()) + // log.Debug(c.buffer.Next(25)) return err } @@ -67,8 +91,25 @@ func (c *MCPClient) GetConnections() error { func (c *MCPClient) GetLinks() error { defer c.buffer.Reset() _, err := c.client.TapiTopologyCore.GetTapiCoreContextTopologyMcpBaseTopologyLink(nil) - c.database.StoreLinks(c.buffer.String()) - log.Debug(c.buffer.Next(25)) + if err != nil { + return err + } + + json := preformatJSON(c.buffer.String(), c.config.GjsonDefaultPath) + + for _, jsonEntry := range json.Array() { + dest := &tapi.TapiCommon_Context_TopologyContext_Topology_Link{} + if err := tapi.Unmarshal([]byte(jsonEntry.String()), dest); err != nil { + //TODO: think about a way how to handle this. + //logging every error is kinda ugly, since ciena tapi throws a + //lot of them. + log.Info(err) + } + log.Info(*dest.Uuid) + } + + // c.database.StoreLinks(c.buffer.String()) + // log.Debug(c.buffer.Next(25)) return err } @@ -77,8 +118,25 @@ func (c *MCPClient) GetLinks() error { func (c *MCPClient) GetNodes() error { defer c.buffer.Reset() _, err := c.client.TapiTopologyCore.GetTapiCoreContextTopologyMcpBaseTopologyNode(nil) - c.database.StoreNodes(c.buffer.String()) - log.Debug(c.buffer.Next(25)) + if err != nil { + return err + } + + json := preformatJSON(c.buffer.String(), c.config.GjsonDefaultPath) + + for _, jsonEntry := range json.Array() { + dest := &tapi.TapiCommon_Context_TopologyContext_Topology_Node{} + if err := tapi.Unmarshal([]byte(jsonEntry.String()), dest); err != nil { + //TODO: think about a way how to handle this. + //logging every error is kinda ugly, since ciena tapi throws a + //lot of them. + log.Info(err) + } + log.Info(*dest.Uuid) + } + + // c.database.StoreNodes(c.buffer.String()) + // log.Debug(c.buffer.Next(25)) return err } @@ -87,7 +145,75 @@ func (c *MCPClient) GetNodes() error { func (c *MCPClient) GetNodeEdgePoints() error { defer c.buffer.Reset() _, err := c.client.TapiTopologyCore.GetTapiCoreContextTopologyMcpBaseTopologyNodeEdgePoint(nil) + if err != nil { + return err + } + //TODO: there is no tapi ygot struct that fits the ciena node-edge-point + dest := &tapi.TapiCommon_Context_TopologyContext_Topology_Link_NodeEdgePoint{} + if err := tapi.Unmarshal(c.buffer.Bytes(), dest); err != nil { + return err + } c.database.StoreNodeEdgePoints(c.buffer.String()) log.Debug(c.buffer.Next(25)) return err } + +//preformatJSON preformats the recieved JSON for further processing +func preformatJSON(jsn string, path string) *gjson.Result { + //TODO: move this! + modifierName := "uppercase" + gjson.AddModifier(modifierName, func(jsonString, arg string) string { + var jsonMap interface{} + err := json.Unmarshal([]byte(jsonString), &jsonMap) + if err != nil { + log.Info("failed unmarshal for JSON") + } + + jsonMap = uppercaseJSONValues(jsonMap) + result, err := json.Marshal(jsonMap) + if err != nil { + log.Info("failed marshal for JSON") + } + return string(result) + }) + + formattedJSON := gjson.Get(jsn, path+"|@"+modifierName) + return &formattedJSON +} + +//uppercaseJSONValues takes a interface{} created with json.Unmarshal() and changes the containing +//string values to uppercase +//returns a interface{} which can be changed back into a JSON string via +//json.Marshal() +func uppercaseJSONValues(jsonMap interface{}) interface{} { + switch jsonMap := jsonMap.(type) { + //check if []interface{} and go through every entry recursively + case []interface{}: + for i := range jsonMap { + jsonMap[i] = uppercaseJSONValues(jsonMap[i]) + } + return jsonMap + //check if map[string]interface, handle ciena tapi json specific fixes + //and go on recursively + case map[string]interface{}: + tmpInterfaceMap := make(map[string]interface{}, len(jsonMap)) + for k, v := range jsonMap { + //TODO: maybe we can uppercase them too, but for now: + //DO NOT uppercase uuid's + if strings.Contains(k, "uuid") { + tmpInterfaceMap[k] = v + } else { + tmpInterfaceMap[k] = uppercaseJSONValues(v) + } + } + return tmpInterfaceMap + //ygot: requires enums in uppercase and since CIENA TAPI does sometimes + //provide faulty JSON values we need to uppercase them before we process + //them further + case string: + return strings.ToUpper(jsonMap) + //default: do nothing (like for bool or other stuff) + default: + return jsonMap + } +}