diff --git a/.gitignore b/.gitignore index efd36da89cad30d35c25ad1ff48db91f4e67b332..f6d6b861ea9bea47efbaec7442ef2f133e6225e4 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ documentation/design/*.pdf .idea/modules.xml .idea/vcs.xml .idea/workspace.xml -restconf/bin/bin \ No newline at end of file +restconf/bin/bin +test/.terraform.local/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb6839da39999ed987596c885dbb2aa6c5198acf..1c0b2ccd34501fa6f7ba6a21c40ad6cedfe6796f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,16 +2,22 @@ variables: SECURE_ANALYZERS_PREFIX: registry.gitlab.com/gitlab-org/security-products/analyzers stages: + - .pre - test - build - deploy + - apply + - integration-test + - .post -before_script: - - git config --global url."https://$GO_MODULES_USER:$GO_MODULES_ACCESS_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de" +default: + before_script: + - git config --global url."https://$GO_MODULES_USER:$GO_MODULES_ACCESS_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de" include: - local: '/build/ci/.code-quality-ci.yml' - local: '/build/ci/.documentation-ci.yml' - local: '/build/ci/.security-and-compliance-ci.yml' - local: '/build/ci/.build-container.yml' - - local: '/build/ci/.test.yml' \ No newline at end of file + - local: '/build/ci/.test.yml' + - local: '/build/ci/.terraform-ci.yml' \ No newline at end of file diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000000000000000000000000000000000000..dcd0d814bd56c70088e075aab00a801b32c1eab5 --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,54 @@ +# goSDN Architecture + +This document describes the the high-level architecture of the goSDN project. All contributors should familiarize themselves with it. To avoid too much divergence from the changing code this document does focus on high-level concepts instead of implementation details. + +## Bird's Eye View + +[<img src="documentation/architecture.png" style="height:50%; width:50%" > ](documentation/architecture.png) + +On the highest level goSDn provides a gRPC northbound-interface and two types of southbound-interfaces: RESTCONF and gRPC-based. The northbound interface allows the interaction with a running goSDN daemon and may allow the stacking of multiple controllers in the future. The southbound interface (SBI) capabilities are split in `nucleus` models and plugins. The supported `nucleus` models are OpenConfig yang [openconfig-yang](https://github.com/openconfig/yang) and TAPI. Third party models and more SBI-transports can be attached using the go plugin architecture. + +The internal data representation uses [ygot](https://github.com/openconfig/ygot) generated go-structs. +It is important to note that these go-structs are generated from yang models and thus are not generic data structures. This means that the `nucleus` code is organized in silos, i.e., one particular southbound-interface is visible in the `nucleus`, as the internal data representation depend on the used yang modes in the southbound-interface. + +## Code Map + +This section briefly describes important directories and data structures. It also introduces important API calls to relevant libraries. + + +It also mentions **architecture invariants** and **API boundaries** +### `api` + +API specification for gRPC and protobuf definitions. + +**Architecture invariant:** To import gRPC related protobuf definitions use `pb` as an import prefix. For gNMI related protobuf definitions use `gpb` + +### `forks` + +Forks of `google/gnxi/gnmi` and `arista/goarista/gnmi` for gNMI server and client respectively. Subject of change once we converge to own clients and servers. + +### `nucleus/principalNetworkDomain` + +`nucleus` is the core package of goSDN. The main data structure is the `principalNetworkDomain` (PND). It reflects one administrative entity, i.e., as set of connected network devices, and is the source of truth for network state and configuration. A PND is SBI agnostic and supports multiple SBI implementations simultaneously. + +**API boundary:** The PND' is the only way to interact with an `orchestratedNetworkingDevice` + +### `nucleus/device` + +This is the representation of an `orchestratedNetworkingDevice` (OND). An `orchestratedNetworkingDevice` is the network device that is directly managed by goSDN. It holds a reference to the device's `transport` and `southboundInterface` implementation. It contains a fakeroot device based on its attached SBI. + +**Architecture invariant:** The device is does not provide any functionality to upper API layers. + +### `nucleus/southbound` + +Implementation of SBI specifics. Provides SBI models to other callers and SBI specific function deviations. + +**Architecture invariant:** Only SBIs defined by a YANG model will be supported by goSDN. + +### `nucleus/transport` `nucleus/gnmi_transport` `nucleus/restconf_transport` + +Transport between goSDN and ONDs. Current core implementations are gNMI and RESTCONF. Additionally to implementing the transports the packages also provide a mapping from general purpose goSDN API calls to diverging SBI API calls. + +For example `gNMI::Subscribe` and `RESTCONF::Push` are mapped to `gosdn::Subscribe`. + +The `gnmi_transport` implementation uses `ytypes.SetNode` to write to a device struct. diff --git a/build/ci/.build-container.yml b/build/ci/.build-container.yml index 8bf61180f5b8ceccf4055264aa890ed8c7e262f6..bd724da8f5d44e1941e122e361ff531f37e658ce 100644 --- a/build/ci/.build-container.yml +++ b/build/ci/.build-container.yml @@ -1,5 +1,10 @@ +image: docker:19.03.12 + +services: + - docker:19.03.12-dind + variables: - ACTIVE_DEVELOP: "v.0.1.0-codename-threadbare" + DOCKER_TLS_CERTDIR: "/certs" DOCKER_IMAGE_SHA: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA build:docker: @@ -7,8 +12,9 @@ build:docker: tags: - baremetal rules: - - if: $CI_COMMIT_BRANCH == $ACTIVE_DEVELOP + - if: $CI_COMMIT_BRANCH == "develop" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + - if: $CI_PIPELINE_SOURCE == "merge_request_event" script: - > docker build \ @@ -32,20 +38,37 @@ deploy:develop: TAG: $CI_REGISTRY_IMAGE:develop HOOK: $PORTAINER_HOOK_DEVELOP rules: - - if: $CI_COMMIT_BRANCH == $ACTIVE_DEVELOP + - if: $CI_COMMIT_BRANCH == "develop" <<: *deploy -deploy:tagged: - rules: - - if: $CI_COMMIT_TAG - script: - - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - - docker tag $CI_REGISTRY_IMAGE:latest $CI_COMMIT_TAG - - docker push $CI_COMMIT_TAG - deploy:latest: variables: TAG: $CI_REGISTRY_IMAGE:latest + HOOK: $PORTAINER_HOOK_LATEST rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH <<: *deploy + +.deploy:mr: &deploy-mr + stage: deploy + needs: ["build:docker"] + tags: + - baremetal + script: + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY + - docker tag $DOCKER_IMAGE_SHA $TAG + - docker push $TAG + +deploy:merge-request:master: + variables: + TAG: $CI_REGISTRY_IMAGE:mr-master + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH + <<: *deploy-mr + +deploy:merge-mr:develop: + variables: + TAG: $CI_REGISTRY_IMAGE:mr-develop + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop' + <<: *deploy-mr diff --git a/build/ci/.terraform-ci.yml b/build/ci/.terraform-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..64a9afccff47147749f84a648463464644d2d9e2 --- /dev/null +++ b/build/ci/.terraform-ci.yml @@ -0,0 +1,75 @@ +image: registry.gitlab.com/gitlab-org/terraform-images/stable:latest + +variables: + TF_ROOT: ${CI_PROJECT_DIR}/test/terraform + TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/integration + +cache: + key: integration + paths: + - ${TF_ROOT}/.terraform + +.terraform_prefab: &tf + variables: + CI_DEBUG_TRACE: "false" + before_script: + - cd ${TF_ROOT} + - export TF_VAR_integration_username=terraform + - export TF_VAR_integration_access_token=${TERRAFORM_API_TOKEN} + - export TF_VAR_integration_registry=${CI_REGISTRY} + - export TF_VAR_tls_key=${DOCKER_TLS_KEY} + - export TF_VAR_tls_cert=${DOCKER_TLS_CERT} + - export TF_VAR_tls_ca_cert=${DOCKER_TLS_CA} + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH + variables: + TF_VAR_container_tag: $CI_REGISTRY_IMAGE:mr-master + - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop' + variables: + TF_VAR_container_tag: $CI_REGISTRY_IMAGE:mr-develop + - if: $CI_COMMIT_BRANCH == "integration-test" + - if: $CI_COMMIT_BRANCH == "develop" + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + +init: + stage: .pre + script: + - gitlab-terraform init + <<: *tf + +validate: + stage: test + script: + - gitlab-terraform validate + needs: ["init"] + <<: *tf + +plan: + before_script: + - cd ${TF_ROOT} + stage: build + script: + - gitlab-terraform plan + - gitlab-terraform plan-json + artifacts: + name: plan + paths: + - ${TF_ROOT}/plan.cache + reports: + terraform: ${TF_ROOT}/plan.json + needs: ["validate"] + <<: *tf + +apply: + stage: apply + script: + - gitlab-terraform apply + dependencies: + - plan + <<: *tf + +destroy: + stage: .post + script: + - gitlab-terraform destroy + <<: *tf \ No newline at end of file diff --git a/build/ci/.test.yml b/build/ci/.test.yml index f6114fcf3ecfa37a8c54e199fdc35a9629369de5..1a0d55ac79da8ec7d1f653118ee217e81771a06e 100644 --- a/build/ci/.test.yml +++ b/build/ci/.test.yml @@ -1,23 +1,34 @@ -unit-test-master: +integration-test: image: golang:1.14 - stage: test + stage: integration-test rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + - if: $CI_COMMIT_BRANCH == "integration-test" + allow_failure: true script: - go test -race $(go list ./... | grep -v /forks/ | grep -v /api/ | grep -v /mocks ) -v -coverprofile=coverage.out after_script: - go tool cover -func=coverage.out +unit-test-merge-request: + image: golang:1.14 + stage: integration-test + allow_failure: true + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH + script: + - go test -race $(go list ./... | grep -v /forks/ | grep -v /api/ | grep -v /mocks ) -v -coverprofile=coverage.out + after_script: + - go tool cover -func=coverage.out unit-test: image: golang:1.14 stage: test allow_failure: true rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH script: - - go test -race $(go list ./... | grep -v /forks/ | grep -v /api/ | grep -v /mocks ) -v -coverprofile=coverage.out + - go test -short -race $(go list ./... | grep -v /forks/ | grep -v /api/ | grep -v /mocks ) -v -coverprofile=coverage.out after_script: - go tool cover -func=coverage.out \ No newline at end of file diff --git a/cmd/gnmi-capabilities/capabilities.go b/cmd/gnmi-capabilities/capabilities.go new file mode 100644 index 0000000000000000000000000000000000000000..54601b8a7ede5805a0d1a3ad633424020a8fc736 --- /dev/null +++ b/cmd/gnmi-capabilities/capabilities.go @@ -0,0 +1,41 @@ +package main + +import ( + "code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi" + "code.fbi.h-da.de/cocsn/gosdn/nucleus" + "context" + "fmt" + gpb "github.com/openconfig/gnmi/proto/gnmi" + log "github.com/sirupsen/logrus" + "strings" +) + +func main() { + cfg := &gnmi.Config{ + Addr: "[2003:e6:1722:fed0:0:242:ac11:5]:6030", + Username: "admin", + Password: "arista", + Encoding: gpb.Encoding_JSON_IETF, + } + transport, err := nucleus.NewGnmiTransport(cfg) + if err != nil { + log.Error(err) + } + resp, err := transport.Capabilities(context.Background()) + if err != nil { + log.Error(err) + } + modelData := resp.(*gpb.CapabilityResponse).SupportedModels + b := strings.Builder{} + for _, elem := range modelData { + _, err := b.WriteString(elem.Name) + if err != nil { + log.Error(err) + } + _, err = b.WriteString("\n") + if err != nil { + log.Error(err) + } + } + fmt.Println(b.String()) +} diff --git a/cmd/gnmi-telemetry/telemetry.go b/cmd/gnmi-telemetry/telemetry.go index fbeb07fdc9c7a5d740c50d72862b887a8d00fe96..42dc9e4506da080e6b50d0103eefcb8e6e215401 100644 --- a/cmd/gnmi-telemetry/telemetry.go +++ b/cmd/gnmi-telemetry/telemetry.go @@ -15,7 +15,7 @@ import ( func main() { log.SetLevel(log.DebugLevel) - sbi := &nucleus.AristaOC{} + sbi := &nucleus.OpenConfig{} device, err := nucleus.NewDevice("gnmi", sbi, &nucleus.GnmiTransportOptions{ @@ -29,14 +29,24 @@ func main() { if err != nil { log.Debug(err) } - pnd, err := nucleus.NewPND("openconfig", "a simple openconfig PND", sbi) + pnd, err := nucleus.NewPND("openconfig", "a simple openconfig PND", uuid.New(), sbi) if err != nil { log.Fatal(err) } - if err := pnd.AddDevice(device); err != nil { + if err := pnd.AddDevice(&device); err != nil { log.Fatal(err) } + cfg := &gnmi.Config{ + Addr: "[2003:e6:1722:fed0:0:242:ac11:5]:6030", + Username: "admin", + Password: "arista", + Encoding: gpb.Encoding_JSON_IETF, + } + transport, _ := nucleus.NewGnmiTransport(cfg) + + device.Transport = transport + paths := []string{"/interfaces/interface/name"} opts := &gnmi.SubscribeOptions{ diff --git a/cmd/gnmi/gnmi.go b/cmd/gnmi/gnmi.go index ba24d802ddb593aae76b97cd5e54f46802914c03..670a4a7e9a93651aa2557de418fa9c264ae423b1 100644 --- a/cmd/gnmi/gnmi.go +++ b/cmd/gnmi/gnmi.go @@ -13,19 +13,15 @@ import ( func main() { log.SetLevel(log.DebugLevel) - sbi := &nucleus.AristaOC{} - device, err := nucleus.NewDevice("gnmi", sbi, - &nucleus.GnmiTransportOptions{ - Addr: "portainer.danet.fbi.h-da.de:6030", - Username: "admin", - Password: "arista", - SetNode: sbi.SetNode(), - Encoding: gpb.Encoding_JSON_IETF, - }) - if err != nil { - log.Debug(err) + sbi := &nucleus.OpenConfig{} + device := &nucleus.Device{ + GoStruct: sbi.Schema().Root, + SBI: sbi, + Config: nucleus.DeviceConfig{ + Uuid: uuid.New(), + }, } - pnd, err := nucleus.NewPND("openconfig", "test description", sbi) + pnd, err := nucleus.NewPND("openconfig", "test description", uuid.New(), sbi) if err != nil { log.Fatal(err) } @@ -33,7 +29,22 @@ func main() { log.Fatal(err) } - p := []string{"/interfaces/interface"} + cfg := &gnmi.Config{ + Addr: "[2003:e6:1722:fed0:0:242:ac11:5]:6030", + Username: "admin", + Password: "arista", + Encoding: gpb.Encoding_JSON_IETF, + } + transport, err := nucleus.NewGnmiTransport(cfg) + if err != nil { + log.Fatal(err) + } + transport.SetNode = sbi.SetNode() + transport.Unmarshal = sbi.Unmarshal() + + device.Transport = transport + + p := []string{"/interfaces"} errors := 0 for _, path := range p { err := pnd.RequestAll(path) diff --git a/cmd/gosdn/main.go b/cmd/gosdn/main.go index 2ba0f61f0edc703b9306dbcc3e733b9900e8912a..367250512af6318f1ad84ec85c139bfec28e1206 100644 --- a/cmd/gosdn/main.go +++ b/cmd/gosdn/main.go @@ -3,10 +3,14 @@ package main import ( "code.fbi.h-da.de/cocsn/gosdn/nucleus" log "github.com/sirupsen/logrus" + "os" ) func main() { - log.SetLevel(log.DebugLevel) + _, debug := os.LookupEnv("GOSDN_DEBUG") + if debug { + log.SetLevel(log.DebugLevel) + } // Setup a channel to communicate if goSDN should shutdown. IsRunningChannel := make(chan bool) diff --git a/cmd/path-traversal/path_traversal.go b/cmd/path-traversal/path_traversal.go index 353c2b8e1c9fcb2538818651e40e6759af2e22a3..4f951a53c5288738c5333e9cdab962a5f4ff005f 100644 --- a/cmd/path-traversal/path_traversal.go +++ b/cmd/path-traversal/path_traversal.go @@ -2,13 +2,13 @@ package main import ( "code.fbi.h-da.de/cocsn/gosdn/nucleus/util" - "code.fbi.h-da.de/cocsn/yang-models/generated/arista" + "code.fbi.h-da.de/cocsn/yang-models/generated/openconfig" log "github.com/sirupsen/logrus" ) func main() { log.SetLevel(log.DebugLevel) - schema, _ := arista.Schema() + schema, _ := openconfig.Schema() paths := util.NewPaths() paths.ParseSchema(schema, "device") diff --git a/configs/gosdn.toml b/configs/gosdn.toml index 229a018b6f844719e7fbb98a3ff18f4f672b6d0d..fe17c7f6c72bd74dce8681c495555e6d6b9ddd37 100644 --- a/configs/gosdn.toml +++ b/configs/gosdn.toml @@ -1,4 +1,4 @@ -CliSocket = "localhost:55055" +CliSocket = ":55055" db.socket = "bolt://172.17.0.4:7687" db.user = "" db.password = "" diff --git a/documentation/architecture.png b/documentation/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..d56101394e87c5584b4a770d3fdd201da378b1b1 Binary files /dev/null and b/documentation/architecture.png differ diff --git a/forks/goarista/gnmi/operation.go b/forks/goarista/gnmi/operation.go index 15ab81fcafee0d693a58bcc265244df7d75de164..01005d6f0877102e4e73124238b4e7cde93fcda9 100644 --- a/forks/goarista/gnmi/operation.go +++ b/forks/goarista/gnmi/operation.go @@ -23,7 +23,6 @@ import ( pb "github.com/openconfig/gnmi/proto/gnmi" "github.com/openconfig/gnmi/proto/gnmi_ext" - "google.golang.org/grpc/codes" ) // GetWithRequest takes a fully formed GetRequest, performs the Get, @@ -54,22 +53,6 @@ func Get(ctx context.Context, client pb.GNMIClient, paths [][]string, return GetWithRequest(ctx, client, req) } -// Capabilities retuns the capabilities of the ciena. -func Capabilities(ctx context.Context, client pb.GNMIClient) error { - resp, err := client.Capabilities(ctx, &pb.CapabilityRequest{}) - if err != nil { - return err - } - fmt.Printf("Version: %s\n", resp.GNMIVersion) - for _, mod := range resp.SupportedModels { - fmt.Printf("SupportedModel: %s\n", mod) - } - for _, enc := range resp.SupportedEncodings { - fmt.Printf("SupportedEncoding: %s\n", enc) - } - return nil -} - // val may be a path to a file or it may be json. First see if it is a // file, if so return its contents, otherwise return val func extractJSON(val string) []byte { @@ -431,24 +414,17 @@ func newSetRequest(setOps []*Operation, exts ...*gnmi_ext.Extension) (*pb.SetReq return req, nil } -// Set sends a SetRequest to the given ciena. +// Set sends a SetRequest to the given client. func Set(ctx context.Context, client pb.GNMIClient, setOps []*Operation, - exts ...*gnmi_ext.Extension) error { + exts ...*gnmi_ext.Extension) (*pb.SetResponse, error) { req, err := newSetRequest(setOps, exts...) if err != nil { - return err + return nil, err } - resp, err := client.Set(ctx, req) - if err != nil { - return err - } - if resp.Message != nil && codes.Code(resp.Message.Code) != codes.OK { - return errors.New(resp.Message.Message) - } - return nil + return client.Set(ctx, req) } -// Subscribe sends a SubscribeRequest to the given ciena. +// Subscribe sends a SubscribeRequest to the given client. // Deprecated: Use SubscribeErr instead. func Subscribe(ctx context.Context, client pb.GNMIClient, subscribeOptions *SubscribeOptions, respChan chan<- *pb.SubscribeResponse, errChan chan<- error) { diff --git a/mocks/Transport.go b/mocks/Transport.go index a2df2b287b0974640857cef15e895121be5e513c..6dc256acae1ee730623be6ab1fd5508f9f4ed9f5 100644 --- a/mocks/Transport.go +++ b/mocks/Transport.go @@ -76,18 +76,14 @@ func (_m *Transport) ProcessResponse(resp interface{}, root interface{}, models } // Set provides a mock function with given fields: ctx, params -func (_m *Transport) Set(ctx context.Context, params ...string) (interface{}, error) { - _va := make([]interface{}, len(params)) - for _i := range params { - _va[_i] = params[_i] - } +func (_m *Transport) Set(ctx context.Context, params ...interface{}) (interface{}, error) { var _ca []interface{} _ca = append(_ca, ctx) - _ca = append(_ca, _va...) + _ca = append(_ca, params...) ret := _m.Called(_ca...) var r0 interface{} - if rf, ok := ret.Get(0).(func(context.Context, ...string) interface{}); ok { + if rf, ok := ret.Get(0).(func(context.Context, ...interface{}) interface{}); ok { r0 = rf(ctx, params...) } else { if ret.Get(0) != nil { @@ -96,7 +92,7 @@ func (_m *Transport) Set(ctx context.Context, params ...string) (interface{}, er } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, ...string) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, ...interface{}) error); ok { r1 = rf(ctx, params...) } else { r1 = ret.Error(1) diff --git a/nucleus/cli-handling.go b/nucleus/cli-handling.go index a8d3a77c5a360f5aa1c0dd393f76f2528d5d1ea3..4eb3c2a874e4dfb5bce042cf60ee991d52af1c04 100644 --- a/nucleus/cli-handling.go +++ b/nucleus/cli-handling.go @@ -145,7 +145,7 @@ func (s *server) CreatePND(ctx context.Context, in *pb.CreatePNDRequest) (*pb.Cr return nil, err } id := uuid.New() - pnd, err := NewPNDwithId(in.GetName(), in.GetDescription(), id, sbi.(SouthboundInterface)) + pnd, err := NewPND(in.GetName(), in.GetDescription(), id, sbi.(SouthboundInterface)) if err != nil { log.Error(err) return &pb.CreatePNDReply{Message: err.Error()}, err diff --git a/nucleus/cli-handling_test.go b/nucleus/cli-handling_test.go index 6a5a49d394fb238c662d9458411c1d448328ddf4..522de1a0cfa12cea3ac919e23f5696865e7159f1 100644 --- a/nucleus/cli-handling_test.go +++ b/nucleus/cli-handling_test.go @@ -374,4 +374,4 @@ func Test_server_Shutdown(t *testing.T) { } }) } -} \ No newline at end of file +} diff --git a/nucleus/controller.go b/nucleus/controller.go index 6c237be25c98da4e161413ed2507338338b0c894..e503fb60e5f8fa45f60b5d557b7c84a7af530f71 100644 --- a/nucleus/controller.go +++ b/nucleus/controller.go @@ -1,6 +1,7 @@ package nucleus import ( + "github.com/google/uuid" "os" "code.fbi.h-da.de/cocsn/gosdn/database" @@ -28,7 +29,7 @@ func (c *Core) Initialize(IsRunningChannel chan bool) error { } // Set config defaults - viper.SetDefault("socket", "localhost:55055") + viper.SetDefault("socket", ":55055") // Set config path and read config viper.SetConfigName("gosdn") @@ -56,10 +57,10 @@ func (c *Core) AttachDatabase() { // CreateSouthboundInterfaces initializes the controller with its supported SBIs func (c *Core) CreateSouthboundInterfaces() error { - if err := c.sbic.add(&AristaOC{}); err != nil { + if err := c.sbic.add(&OpenConfig{id: uuid.New()}); err != nil { return err } - if err := c.sbic.add(&OpenConfig{}); err != nil { + if err := c.sbic.add(&OpenConfig{id: uuid.New()}); err != nil { return err } return nil diff --git a/nucleus/device_test.go b/nucleus/device_test.go index 0fa4ffa903a1f894325aaf5211341e19a2df754a..443744d8c8c91ac46a8fade40c91967effd125f7 100644 --- a/nucleus/device_test.go +++ b/nucleus/device_test.go @@ -1 +1,93 @@ package nucleus + +import ( + "code.fbi.h-da.de/cocsn/yang-models/generated/openconfig" + "github.com/google/uuid" + "github.com/openconfig/ygot/ygot" + "reflect" + "testing" +) + +func TestDevice_Id(t *testing.T) { + type fields struct { + GoStruct ygot.GoStruct + SBI SouthboundInterface + Config DeviceConfig + Transport Transport + } + tests := []struct { + name string + fields fields + want uuid.UUID + }{ + { + name: "default", + fields: fields{ + Config: DeviceConfig{ + Uuid: did, + }, + }, + want: did, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &Device{ + GoStruct: tt.fields.GoStruct, + SBI: tt.fields.SBI, + Config: tt.fields.Config, + Transport: tt.fields.Transport, + } + if got := d.Id(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("Id() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNewDevice(t *testing.T) { + sbi := &OpenConfig{} + type args struct { + sbi SouthboundInterface + addr string + username string + password string + transport Transport + } + tests := []struct { + name string + args args + want *Device + }{ + { + name: "default", + args: args{ + sbi: sbi, + addr: "testdevice", + username: "testuser", + password: "testpassword", + transport: &Gnmi{}, + }, + want: &Device{ + GoStruct: &openconfig.Device{}, + SBI: sbi, + Config: DeviceConfig{ + Uuid: uuid.UUID{}, + Address: "testdevice", + Username: "testuser", + Password: "testpassword", + }, + Transport: &Gnmi{}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := NewDevice(tt.args.sbi, tt.args.addr, tt.args.username, tt.args.password, tt.args.transport) + tt.want.Config.Uuid = got.Id() + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewDevice() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/nucleus/errors.go b/nucleus/errors.go index ce23a6d6f9d18bc6a650b941c48fa561a2dfc98e..9656b7327acc584f7240fa09af334904e2f92d06 100644 --- a/nucleus/errors.go +++ b/nucleus/errors.go @@ -33,3 +33,26 @@ type ErrInvalidTypeAssertion struct { func (e ErrInvalidTypeAssertion) Error() string { return fmt.Sprintf("%v does not implement %v", e.v, e.t) } + +type ErrUnsupportedPath struct { + p interface{} +} + +func (e ErrUnsupportedPath) Error() string { + return fmt.Sprintf("path %v is not supported", e.p) +} + +type ErrNotYetImplemented struct{} + +func (e ErrNotYetImplemented) Error() string { + return fmt.Sprintf("function not yet implemented") +} + +type ErrInvalidParameters struct { + f interface{} + r interface{} +} + +func (e ErrInvalidParameters) Error() string { + return fmt.Sprintf("invalid parameters for %v: %v", e.f, e.r) +} \ No newline at end of file diff --git a/nucleus/gnmi_transport.go b/nucleus/gnmi_transport.go index baee06334c303c24b20bcaa804be3c03ecb4fd03..c8e43a80012728a0d094b7fe0c9eda62e09d583f 100644 --- a/nucleus/gnmi_transport.go +++ b/nucleus/gnmi_transport.go @@ -2,51 +2,34 @@ package nucleus import ( "code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi" - "code.fbi.h-da.de/cocsn/gosdn/nucleus/util" "context" - "errors" gpb "github.com/openconfig/gnmi/proto/gnmi" "github.com/openconfig/gnmi/proto/gnmi_ext" "github.com/openconfig/goyang/pkg/yang" "github.com/openconfig/ygot/ytypes" log "github.com/sirupsen/logrus" "strings" - "time" ) -var tapProto bool - -func init() { - // tapProto taps gpb.getResponse and gpb.Getrequests - // to binary file - // CAUTION only set true if you know what you do - tapProto = false -} - -type Gnmi struct { - SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error - RespChan chan *gpb.SubscribeResponse - Options *GnmiTransportOptions - config *gnmi.Config - client gpb.GNMIClient -} - -func NewGnmiTransport(opts *GnmiTransportOptions) (*Gnmi, error) { - config := createConfig(opts) +func NewGnmiTransport(config *gnmi.Config) (*Gnmi, error) { c, err := gnmi.Dial(config) if err != nil { return nil, err } return &Gnmi{ - SetNode: opts.SetNode, - RespChan: opts.RespChan, - Options: opts, - config: config, - client: c, + config: config, + client: c, }, nil } -//SetConfig sets the config of gnmi +type Gnmi struct { + SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error + Unmarshal func([]byte, []string, interface{}, ...ytypes.UnmarshalOpt) error + RespChan chan *gpb.SubscribeResponse + config *gnmi.Config + client gpb.GNMIClient +} + func (g *Gnmi) SetConfig(config *gnmi.Config) { g.config = config } @@ -85,11 +68,44 @@ func (g *Gnmi) Get(ctx context.Context, params ...string) (interface{}, error) { paths := gnmi.SplitPaths(params) return g.get(ctx, paths, "") } -func (g *Gnmi) Set(ctx context.Context, params ...string) (interface{}, error) { + +// Set takes a slice of params. This slice must contain at least one operation. +// It can contain an additional arbitrary amount of operations and extensions. +func (g *Gnmi) Set(ctx context.Context, params ...interface{}) (interface{}, error) { if g.client == nil { return nil, &ErrNilClient{} } - return nil, nil + if len(params) == 0 { + return nil, &ErrInvalidParameters{ + f: "gnmi.Set()", + r: "no parameters provided", + } + } + + // Loop over params and create ops and exts + // Invalid params cause unhealable error + ops := make([]*gnmi.Operation, 0) + exts := make([]*gnmi_ext.Extension, 0) + for _,p := range params{ + switch p.(type) { + case *gnmi.Operation: + ops = append(ops, p.(*gnmi.Operation)) + case *gnmi_ext.Extension: + exts = append(exts, p.(*gnmi_ext.Extension)) + default: + return nil, &ErrInvalidParameters{ + f: "gnmi.Set()", + r: "params contain invalid type", + } + } + } + if len(ops) == 0 { + return nil, &ErrInvalidParameters{ + f: "gnmi.Set()", + r: "no operations provided", + } + } + return g.set(ctx, ops, exts...) } func (g *Gnmi) Subscribe(ctx context.Context, params ...string) error { @@ -106,26 +122,23 @@ func (g *Gnmi) Type() string { // ProcessResponse takes a gNMI response and serializes the contents to the root struct. func (g *Gnmi) ProcessResponse(resp interface{}, root interface{}, s *ytypes.Schema) error { models := s.SchemaTree - opts := []ytypes.SetNodeOpt{&ytypes.InitMissingElements{}, &ytypes.TolerateJSONInconsistencies{}} r := resp.(*gpb.GetResponse) rn := r.Notification for _, msg := range rn { for _, update := range msg.Update { - prefix := msg.Prefix path := update.Path fullPath := path - if prefix != nil { - var err error - fullPath, err = gnmiFullPath(prefix, path) - if err != nil { + val, ok := update.Val.Value.(*gpb.TypedValue_JsonIetfVal) + if ok { + opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}} + if err := g.Unmarshal(val.JsonIetfVal, extraxtPathElements(fullPath), root, opts...); err != nil { return err } + return nil } - modelKey := extractModelKey(fullPath) - - log.Debug(modelKey) - + // TODO(mk): Evaluate hardcoded model key schema := models["Device"] + opts := []ytypes.SetNodeOpt{&ytypes.InitMissingElements{}, &ytypes.TolerateJSONInconsistencies{}} if err := g.SetNode(schema, root, update.Path, update.Val, opts...); err != nil { return err } @@ -134,36 +147,18 @@ func (g *Gnmi) ProcessResponse(resp interface{}, root interface{}, s *ytypes.Sch return nil } -// extractModelKey extracts the model's key from the full path. Highly model specific for now -// TODO: Remove hard coded model prefix -// TODO: Figure out why path.Elem() is empty but path.Elememt() is deprecated -func extractModelKey(path *gpb.Path) string { - var b strings.Builder - delim := "_" - b.WriteString("OpenconfigInterfaces") - for i := 0; i < len(path.Elem)-1; i++ { - pathElement := path.Elem[i] - b.WriteString(delim) - b.WriteString(strings.Title(pathElement.Name)) - } - return b.String() -} - -// gnmiFullPath builds the full path from the prefix and path. -// Copycat from forks/google/gnmi/server.go -func gnmiFullPath(prefix, path *gpb.Path) (*gpb.Path, error) { - fullPath := &gpb.Path{Origin: path.Origin} - if path.GetElement() != nil { - return nil, errors.New("deprecated path element type is unsupported") - } - if path.GetElem() != nil { - fullPath.Elem = append(prefix.GetElem(), path.GetElem()...) +func extraxtPathElements(path *gpb.Path) []string { + elems := make([]string, len(path.Elem)) + for i, e := range path.Elem { + elems[i] = strings.Title(e.Name) } - return fullPath, nil + return elems } // Capabilities calls GNMI capabilities func (g *Gnmi) Capabilities(ctx context.Context) (interface{}, error) { + ctx = gnmi.NewContext(ctx, g.config) + ctx = context.WithValue(ctx, "config", g.config) resp, err := g.client.Capabilities(ctx, &gpb.CapabilityRequest{}) if err != nil { return nil, err @@ -171,7 +166,7 @@ func (g *Gnmi) Capabilities(ctx context.Context) (interface{}, error) { return resp, nil } -// Get calls GNMI get +// get calls GNMI get func (g *Gnmi) get(ctx context.Context, paths [][]string, origin string) (interface{}, error) { ctx = gnmi.NewContext(ctx, g.config) ctx = context.WithValue(ctx, "config", g.config) @@ -186,14 +181,6 @@ func (g *Gnmi) get(ctx context.Context, paths [][]string, origin string) (interf // and returns any response. func (g *Gnmi) getWithRequest(ctx context.Context, req *gpb.GetRequest) (interface{}, error) { resp, err := g.client.Get(ctx, req) - if tapProto { - if err := util.Write(req, "req-"+time.Now().String()); err != nil { - log.Errorf("error while writing request: %v", err) - } - if err := util.Write(resp, "resp-"+time.Now().String()); err != nil { - log.Errorf("error while writing request: %v", err) - } - } if err != nil { return nil, err } @@ -202,7 +189,7 @@ func (g *Gnmi) getWithRequest(ctx context.Context, req *gpb.GetRequest) (interfa // Set calls GNMI set func (g *Gnmi) set(ctx context.Context, setOps []*gnmi.Operation, - exts ...*gnmi_ext.Extension) error { + exts ...*gnmi_ext.Extension) (*gpb.SetResponse, error) { ctx = gnmi.NewContext(ctx, g.config) return gnmi.Set(ctx, g.client, setOps, exts...) } @@ -214,8 +201,10 @@ func (g *Gnmi) subscribe(ctx context.Context) error { go func() { for { resp := <-g.RespChan - if err := gnmi.LogSubscribeResponse(resp); err != nil { - log.Fatal(err) + if resp != nil { + if err := gnmi.LogSubscribeResponse(resp); err != nil { + log.Fatal(err) + } } } }() diff --git a/nucleus/gnmi_transport_test.go b/nucleus/gnmi_transport_test.go index 3cd5cc2d706978b141299b51a97250466751e51e..ebc08a383d2bad8c170347665edb6f40326ca77e 100644 --- a/nucleus/gnmi_transport_test.go +++ b/nucleus/gnmi_transport_test.go @@ -4,12 +4,14 @@ import ( "code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi" "code.fbi.h-da.de/cocsn/gosdn/mocks" "code.fbi.h-da.de/cocsn/gosdn/nucleus/util" - "code.fbi.h-da.de/cocsn/gosdn/test_resources" - "code.fbi.h-da.de/cocsn/yang-models/generated/arista" + "code.fbi.h-da.de/cocsn/gosdn/test" "code.fbi.h-da.de/cocsn/yang-models/generated/openconfig" "context" + "errors" log "github.com/golang/glog" + "github.com/golang/protobuf/proto" gpb "github.com/openconfig/gnmi/proto/gnmi" + "github.com/openconfig/gnmi/proto/gnmi_ext" "github.com/openconfig/goyang/pkg/yang" "github.com/openconfig/ygot/ytypes" "github.com/stretchr/testify/mock" @@ -21,9 +23,29 @@ import ( // TestMain bootstraps all tests. Humongous beast // TODO: Move somewhere more sensible func TestMain(m *testing.M) { + gnmiMessages = map[string]proto.Message{ + "../test/cap-resp-arista-ceos": &gpb.CapabilityResponse{}, + "../test/req-full-node": &gpb.GetRequest{}, + "../test/req-full-node-arista-ceos": &gpb.GetRequest{}, + "../test/req-interfaces-arista-ceos": &gpb.GetRequest{}, + "../test/req-interfaces-interface-arista-ceos": &gpb.GetRequest{}, + "../test/req-interfaces-wildcard": &gpb.GetRequest{}, + "../test/resp-full-node": &gpb.GetResponse{}, + "../test/resp-full-node-arista-ceos": &gpb.GetResponse{}, + "../test/resp-interfaces-arista-ceos": &gpb.GetResponse{}, + "../test/resp-interfaces-interface-arista-ceos": &gpb.GetResponse{}, + "../test/resp-interfaces-wildcard": &gpb.GetResponse{}, + } + for k, v := range gnmiMessages { + if err := util.Read(k, v); err != nil { + log.Fatalf("error parsing %v: %v", k, err) + } + } testSetupGnmi() testSetupPnd() testSetupStore() + testSetupSbi() + testSetupIntegration() os.Exit(m.Run()) } @@ -45,7 +67,7 @@ func testSetupGnmi() { func targetRunner() { for { addr := <-startGnmiTarget - if err := test_resources.GnmiTarget(stopGnmiTarget, addr); err != nil { + if err := test.GnmiTarget(stopGnmiTarget, addr); err != nil { log.Fatal(err) } } @@ -61,17 +83,7 @@ func mockTransport() Gnmi { } } -func newGnmiTransportOptions() *GnmiTransportOptions { - return &GnmiTransportOptions{ - Username: "test", - Password: "test", - Addr: "localhost:13371", - SetNode: nil, - RespChan: make(chan *gpb.SubscribeResponse), - Encoding: gpb.Encoding_PROTO, - } -} - +var gnmiMessages map[string]proto.Message var gnmiConfig *gnmi.Config var startGnmiTarget chan string var stopGnmiTarget chan bool @@ -122,9 +134,11 @@ func TestGnmi_Capabilities(t *testing.T) { capabilityRequest := &gpb.CapabilityRequest{} - ctx := context.Background() transport.client.(*mocks.GNMIClient). - On("Capabilities", ctx, capabilityRequest). + On("NewContext", mockContext, mock.Anything). + Return(mockContext) + transport.client.(*mocks.GNMIClient). + On("Capabilities", mockContext, capabilityRequest). Return(capabilityResponse, nil) type fields struct { @@ -327,37 +341,28 @@ func TestGnmi_ProcessResponse(t *testing.T) { wantErr bool }{ { - name: "Arista Full Node", - fields: fields{Sbi: &AristaOC{}}, - args: args{ - path: "../test_resources/resp-full-node", - root: &arista.Device{}, - }, - wantErr: false, - }, - { - name: "Arista Interfaces Wildcard", - fields: fields{Sbi: &AristaOC{}}, + name: "Interfaces Interface", + fields: fields{Sbi: &OpenConfig{}}, args: args{ - path: "../test_resources/resp-interfaces-wildcard", - root: &arista.Device{}, + path: "../test/resp-interfaces-interface-arista-ceos", + root: &openconfig.Device{}, }, - wantErr: false, + wantErr: true, }, { - name: "OC Full Node", + name: "Interfaces Wildcard", fields: fields{Sbi: &OpenConfig{}}, args: args{ - path: "../test_resources/resp-full-node", + path: "../test/resp-interfaces-wildcard", root: &openconfig.Device{}, }, wantErr: false, }, { - name: "OC Interfaces Wildcard", + name: "Root", fields: fields{Sbi: &OpenConfig{}}, args: args{ - path: "../test_resources/resp-interfaces-wildcard", + path: "../test/resp-full-node-arista-ceos", root: &openconfig.Device{}, }, wantErr: false, @@ -366,13 +371,11 @@ func TestGnmi_ProcessResponse(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { g := &Gnmi{ - SetNode: tt.fields.Sbi.SetNode(), + SetNode: tt.fields.Sbi.SetNode(), + Unmarshal: tt.fields.Sbi.(*OpenConfig).Unmarshal(), } s := tt.fields.Sbi.Schema() - resp := &gpb.GetResponse{} - if err := util.Read(tt.args.path, resp); err != nil { - t.Errorf("error reading file %v,", err) - } + resp := gnmiMessages[tt.args.path] if err := g.ProcessResponse(resp, tt.args.root, s); (err != nil) != tt.wantErr { t.Errorf("ProcessResponse() error = %v, wantErr %v", err, tt.wantErr) } @@ -385,7 +388,7 @@ func TestGnmi_Set(t *testing.T) { transport *Gnmi } type args struct { - params []string + params []interface{} runEndpoint bool } tests := []struct { @@ -434,11 +437,29 @@ func TestGnmi_SetConfig(t *testing.T) { fields fields args args }{ - // TODO: Add test cases. + { + name: "default", + fields: fields{ + SetNode: nil, + RespChan: nil, + config: nil, + }, + args: args{ + config: &gnmi.Config{ + Addr: "test:///", + Password: "test", + Username: "test", + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - + g := &Gnmi{} + g.SetConfig(tt.args.config) + if !reflect.DeepEqual(g.config, tt.args.config) { + t.Errorf("Type() = %v, want %v", g.config, tt.args.config) + } }) } } @@ -459,15 +480,11 @@ func TestGnmi_Subscribe(t *testing.T) { args args wantErr bool }{ - // TODO: Add test cases. + {name: "nil client", fields: fields{}, args: args{}, wantErr: true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - g := &Gnmi{ - SetNode: tt.fields.SetNode, - RespChan: tt.fields.RespChan, - config: tt.fields.config, - } + g := &Gnmi{} if err := g.Subscribe(tt.args.ctx, tt.args.params...); (err != nil) != tt.wantErr { t.Errorf("Subscribe() error = %v, wantErr %v", err, tt.wantErr) } @@ -502,36 +519,12 @@ func TestGnmi_Type(t *testing.T) { } } -func TestGnmi_get(t *testing.T) { - // TODO: Design integration test for this one -} - func TestGnmi_getWithRequest(t *testing.T) { transport := mockTransport() - reqFullNode := &gpb.GetRequest{} - reqInterfacesWildcard := &gpb.GetRequest{} - respFullNode := &gpb.GetResponse{} - respInterfacesWildcard := &gpb.GetResponse{} - respInterfacesWildcardExp := &gpb.GetResponse{} - respFullNodeExp := &gpb.GetResponse{} - if err := util.Read("../test_resources/req-full-node", reqFullNode); err != nil { - t.Errorf("error parsing req-full-node: %v", err) - } - if err := util.Read("../test_resources/req-interfaces-wildcard", reqInterfacesWildcard); err != nil { - t.Errorf("error parsing req-interfaces-wildcard: %v", err) - } - if err := util.Read("../test_resources/resp-full-node", respFullNode); err != nil { - t.Errorf("error parsing getFullNode: %v", err) - } - if err := util.Read("../test_resources/resp-full-node", respFullNodeExp); err != nil { - t.Errorf("error parsing getFullNode: %v", err) - } - if err := util.Read("../test_resources/resp-interfaces-wildcard", respInterfacesWildcard); err != nil { - t.Errorf("error parsing getFullNode: %v", err) - } - if err := util.Read("../test_resources/resp-interfaces-wildcard", respInterfacesWildcardExp); err != nil { - t.Errorf("error parsing getFullNode: %v", err) - } + reqFullNode := gnmiMessages["../test/req-full-node"].(*gpb.GetRequest) + reqInterfacesWildcard := gnmiMessages["../test/req-interfaces-wildcard"].(*gpb.GetRequest) + respFullNode := gnmiMessages["../test/resp-full-node"].(*gpb.GetResponse) + respInterfacesWildcard := gnmiMessages["../test/resp-interfaces-wildcard"].(*gpb.GetResponse) transport.client.(*mocks.GNMIClient). On("Get", mockContext, reqFullNode). @@ -541,6 +534,10 @@ func TestGnmi_getWithRequest(t *testing.T) { On("Get", mockContext, reqInterfacesWildcard). Return(respInterfacesWildcard, nil) + transport.client.(*mocks.GNMIClient). + On("Get", mockContext, mock.Anything). + Return(nil, errors.New("expected mock gnmi error")) + type fields struct { transport *Gnmi } @@ -561,7 +558,7 @@ func TestGnmi_getWithRequest(t *testing.T) { args: args{ request: reqFullNode, }, - want: respFullNodeExp, + want: respFullNode, wantErr: false, }, { @@ -570,9 +567,19 @@ func TestGnmi_getWithRequest(t *testing.T) { args: args{ request: reqInterfacesWildcard, }, - want: respInterfacesWildcardExp, + want: respInterfacesWildcard, wantErr: false, }, + { + name: "invalid request", + fields: fields{transport: &transport}, + args: args{ + request: nil, + runEndpoint: false, + }, + want: nil, + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -588,56 +595,167 @@ func TestGnmi_getWithRequest(t *testing.T) { } } -func TestGnmi_set(t *testing.T) { - // Does not test well +func TestNewGnmiTransport(t *testing.T) { + type args struct { + config *gnmi.Config + } + tests := []struct { + name string + args args + want *Gnmi + wantErr bool + }{ + { + name: "default", + args: args{config: &gnmi.Config{ + Username: "test", + Password: "test", + Addr: "localhost:13371", + Encoding: gpb.Encoding_PROTO, + }}, + want: &Gnmi{ + config: &gnmi.Config{ + Username: "test", + Password: "test", + Addr: "localhost:13371", + Encoding: gpb.Encoding_PROTO, + }, + client: nil, + }, + wantErr: false, + }, + { + name: "unsupported compression", + args: args{config: &gnmi.Config{Compression: "brotli"}}, + want: nil, + wantErr: true, + }, + { + name: "certificate error no key file", + args: args{config: &gnmi.Config{TLS: true, CertFile: "invalid", KeyFile: ""}}, + want: nil, + wantErr: true, + }, + { + name: "certificate error no ca file", + args: args{config: &gnmi.Config{TLS: true, CAFile: "invalid"}}, + want: nil, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.name == "default" { + startGnmiTarget <- gnmiConfig.Addr + } + got, err := NewGnmiTransport(tt.args.config) + if (err != nil) != tt.wantErr { + t.Errorf("NewGnmiTransport() error = %v, wantErr %v", err, tt.wantErr) + return + } + if tt.name == "default" && got != nil { + tt.want.client = got.client + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewGnmiTransport() got = %v, want %v", got, tt.want) + } + if tt.name == "default" { + stopGnmiTarget <- true + } + }) + } } -func TestGnmi_subscribe(t *testing.T) { - // TODO: Design integration test for this one -} +func TestGnmi_set(t *testing.T) { + transport := mockTransport() + mockResponse := &gpb.SetResponse{} -func Test_extractModelKey(t *testing.T) { + transport.client.(*mocks.GNMIClient). + On("NewContext", mockContext, mock.Anything). + Return(mockContext) + + transport.client.(*mocks.GNMIClient). + On("Set", mockContext, mock.Anything,mock.Anything). + Return(mockResponse, nil) + + type fields struct { + transport *Gnmi + } type args struct { - path *gpb.Path + ctx context.Context + setOps []*gnmi.Operation + exts []*gnmi_ext.Extension } tests := []struct { - name string - args args - want string + name string + fields fields + args args + want *gpb.SetResponse + + wantErr bool }{ - // TODO: Add test cases. + { + name: "default", + fields: fields{transport: &transport}, + args: args{ + ctx: context.Background(), + setOps: []*gnmi.Operation{ + { + Type: "update", + Path: []string{"interfaces", "interface", "name"}, + Val: "test0", + }, + }, + exts: nil, + }, + want: &gpb.SetResponse{}, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := extractModelKey(tt.args.path); got != tt.want { - t.Errorf("extractModelKey() = %v, want %v", got, tt.want) + got, err := tt.fields.transport.set(tt.args.ctx, tt.args.setOps, tt.args.exts...) + if (err != nil) != tt.wantErr { + t.Errorf("set() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("set() got = %v, want %v", got, tt.want) } }) } } -func Test_gnmiFullPath(t *testing.T) { +func TestGnmi_subscribe(t *testing.T) { + type fields struct { + SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error + Unmarshal func([]byte, []string, interface{}, ...ytypes.UnmarshalOpt) error + RespChan chan *gpb.SubscribeResponse + config *gnmi.Config + client gpb.GNMIClient + } type args struct { - prefix *gpb.Path - path *gpb.Path + ctx context.Context } tests := []struct { name string + fields fields args args - want *gpb.Path wantErr bool }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := gnmiFullPath(tt.args.prefix, tt.args.path) - if (err != nil) != tt.wantErr { - t.Errorf("gnmiFullPath() error = %v, wantErr %v", err, tt.wantErr) - return + g := &Gnmi{ + SetNode: tt.fields.SetNode, + Unmarshal: tt.fields.Unmarshal, + RespChan: tt.fields.RespChan, + config: tt.fields.config, + client: tt.fields.client, } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("gnmiFullPath() got = %v, want %v", got, tt.want) + if err := g.subscribe(tt.args.ctx); (err != nil) != tt.wantErr { + t.Errorf("subscribe() error = %v, wantErr %v", err, tt.wantErr) } }) } diff --git a/nucleus/integration_test.go b/nucleus/integration_test.go new file mode 100644 index 0000000000000000000000000000000000000000..b8633c1c064025241fb48a388f431f2736173ac5 --- /dev/null +++ b/nucleus/integration_test.go @@ -0,0 +1,252 @@ +package nucleus + +import ( + "code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi" + "context" + gpb "github.com/openconfig/gnmi/proto/gnmi" + "os" + "reflect" + "testing" + "time" +) + +var address = "141.100.70.171:6030" +var cfg *gnmi.Config + +func testSetupIntegration() { + a := os.Getenv("GOSDN_TEST_ENDPOINT") + if a != "" { + address = a + } + + cfg = &gnmi.Config{ + Addr: address, + Username: "admin", + Password: "arista", + Encoding: gpb.Encoding_JSON_IETF, + } +} + +func TestGnmi_SetIntegration(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + type fields struct { + config *gnmi.Config + } + type args struct { + ctx context.Context + params []interface{} + } + tests := []struct { + name string + fields fields + args args + want interface{} + wantErr bool + }{ + { + name: "destination unreachable", + fields: fields{config: &gnmi.Config{ + Addr: "203.0.113.10:6030", + }, + }, + args: args{ + ctx: context.Background(), + params: []interface{}{&gnmi.Operation{}}, + }, + want: nil, + wantErr: true, + }, + { + name: "valid update", + fields: fields{config: cfg}, + args: args{ + ctx: context.Background(), + params: []interface{}{ + &gnmi.Operation{ + Type: "update", + Origin: "", + Target: "", + Path: []string{ + "system", + "config", + "hostname", + }, + Val: "ceos3000", + }, + }, + }, + want: &gpb.SetResponse{}, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + g, err := NewGnmiTransport(cfg) + if err != nil { + t.Error(err) + } + got, err := g.Set(tt.args.ctx, tt.args.params...) + if (err != nil) != tt.wantErr { + t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Set() got = %v, want %v", got, tt.want) + } + }) + } +} +func TestGnmi_GetIntegration(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + t.Run("Test GNMI Get", func(t *testing.T) { + transport, err := NewGnmiTransport(cfg) + if err != nil { + t.Error(err) + } + p := []string{"/interfaces/interface"} + resp, err := transport.Get(context.Background(), p...) + if err != nil { + t.Error(err) + } + if resp == nil { + t.Error("resp is nil") + } + }) +} + +func TestGnmi_SubscribeIntegration(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + if os.Getenv("GOSDN_TEST_ENDPOINT") != "" { + t.Skip("skipping locally running integration test") + } + + t.Run("Test GNMI Subscribe", func(t *testing.T) { + transport, err := NewGnmiTransport(cfg) + if err != nil { + t.Error(err) + } + transport.RespChan = make(chan *gpb.SubscribeResponse) + + paths := []string{"/interfaces/interface/name"} + + opts := &gnmi.SubscribeOptions{ + UpdatesOnly: false, + Prefix: "", + Mode: "stream", + StreamMode: "sample", + SampleInterval: uint64(10 * time.Second.Nanoseconds()), + SuppressRedundant: false, + HeartbeatInterval: uint64(time.Second.Nanoseconds()), + Paths: gnmi.SplitPaths(paths), + Origin: "", + Target: address, + } + ctx := context.WithValue(context.Background(), "opts", opts) + go func() { + if err := transport.Subscribe(ctx); err != nil { + t.Error(err) + } + }() + time.Sleep(time.Second * 30) + ctx.Done() + time.Sleep(time.Second * 5) + }) +} + +func TestGnmi_CapabilitiesIntegration(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + type fields struct { + config *gnmi.Config + } + type args struct { + ctx context.Context + } + tests := []struct { + name string + fields fields + args args + want interface{} + wantErr bool + }{ + { + name: "supported models", + fields: fields{config: cfg}, + args: args{ctx: context.Background()}, + want: gnmiMessages["../test/cap-resp-arista-ceos"].(*gpb.CapabilityResponse).SupportedModels, + wantErr: false, + }, + { + name: "supported encodings", + fields: fields{config: cfg}, + args: args{ctx: context.Background()}, + want: gnmiMessages["../test/cap-resp-arista-ceos"].(*gpb.CapabilityResponse).SupportedEncodings, + wantErr: false, + }, + { + name: "gnmi version", + fields: fields{config: cfg}, + args: args{ctx: context.Background()}, + want: gnmiMessages["../test/cap-resp-arista-ceos"].(*gpb.CapabilityResponse).GNMIVersion, + wantErr: false, + }, + { + name: "destination unreachable", + fields: fields{config: &gnmi.Config{ + Addr: "203.0.113.10:6030", + }, + }, + args: args{ctx: context.Background()}, + want: nil, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + g, err := NewGnmiTransport(tt.fields.config) + if err != nil { + t.Error(err) + return + } + resp, err := g.Capabilities(tt.args.ctx) + if (err != nil) != tt.wantErr { + t.Errorf("Capabilities() error = %v, wantErr %v", err, tt.wantErr) + return + } + var got interface{} + switch tt.name { + case "supported encodings": + got = resp.(*gpb.CapabilityResponse).SupportedEncodings + case "supported models": + got = resp.(*gpb.CapabilityResponse).SupportedModels + case "gnmi version": + got = resp.(*gpb.CapabilityResponse).GNMIVersion + default: + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Type() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestPndImplementation_RequestAllIntegration(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + t.Fail() +} + +func TestPndImplementation_RequestIntegration(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + t.Fail() +} diff --git a/nucleus/principalNetworkDomain.go b/nucleus/principalNetworkDomain.go index 7b26ada3e9e07f3426efbf8159c15a269e543359..ec7a80f2b15e343341164529ebcc2dc3ff9dff32 100644 --- a/nucleus/principalNetworkDomain.go +++ b/nucleus/principalNetworkDomain.go @@ -34,20 +34,7 @@ type pndImplementation struct { } // NewPND creates a Principle Network Domain -func NewPND(name, description string, sbi SouthboundInterface) (PrincipalNetworkDomain, error) { - pnd := &pndImplementation{ - name: name, - description: description, - sbic: sbiStore{store{}}, - devices: deviceStore{store{}}, - } - if err := pnd.sbic.add(sbi); err != nil { - return nil, &ErrAlreadyExists{item: sbi} - } - return pnd, nil -} - -func NewPNDwithId(name, description string, id uuid.UUID, sbi SouthboundInterface) (PrincipalNetworkDomain, error) { +func NewPND(name, description string, id uuid.UUID, sbi SouthboundInterface) (PrincipalNetworkDomain, error) { pnd := &pndImplementation{ name: name, description: description, diff --git a/nucleus/principalNetworkDomain_test.go b/nucleus/principalNetworkDomain_test.go index 622be43e8187e8dad710f2c2d3f675f0f99cfb89..cb5f3f5f78ec6e29ecbbfe9b186ebbf413ed91f0 100644 --- a/nucleus/principalNetworkDomain_test.go +++ b/nucleus/principalNetworkDomain_test.go @@ -44,15 +44,6 @@ func mockDevice() Device { } func newPnd() pndImplementation { - return pndImplementation{ - name: "default", - description: "default test pnd", - sbic: sbiStore{store{}}, - devices: deviceStore{store{}}, - } -} - -func newPndWithId() pndImplementation { return pndImplementation{ name: "default", description: "default test pnd", @@ -76,6 +67,7 @@ func TestNewPND(t *testing.T) { name string description string sbi SouthboundInterface + pid uuid.UUID } tests := []struct { name string @@ -89,6 +81,7 @@ func TestNewPND(t *testing.T) { name: "default", description: "default test pnd", sbi: &OpenConfig{id: defaultSbiId}, + pid: defaultPndId, }, want: &pnd, wantErr: false, @@ -96,7 +89,7 @@ func TestNewPND(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := NewPND(tt.args.name, tt.args.description, tt.args.sbi) + got, err := NewPND(tt.args.name, tt.args.description, tt.args.pid, tt.args.sbi) if (err != nil) != tt.wantErr { t.Errorf("NewPND() error = %v, wantErr %v", err, tt.wantErr) return @@ -108,49 +101,6 @@ func TestNewPND(t *testing.T) { } } -func TestNewPNDwithId(t *testing.T) { - pnd := newPndWithId() - if err := pnd.addSbi(&OpenConfig{id: defaultSbiId}); err != nil { - t.Error(err) - } - type args struct { - name string - description string - id uuid.UUID - sbi SouthboundInterface - } - tests := []struct { - name string - args args - want PrincipalNetworkDomain - wantErr bool - }{ - { - name: "default", - args: args{ - name: "default", - description: "default test pnd", - id: defaultPndId, - sbi: &OpenConfig{id: defaultSbiId}, - }, - want: &pnd, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := NewPNDwithId(tt.args.name, tt.args.description, tt.args.id, tt.args.sbi) - if (err != nil) != tt.wantErr { - t.Errorf("NewPNDwithId() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("NewPNDwithId() got = %v, want %v", got, tt.want) - } - }) - } -} - func Test_destroy(t *testing.T) { tests := []struct { name string diff --git a/nucleus/restconf_transport.go b/nucleus/restconf_transport.go index 84d904a562b6c87d84378814b8247ad0df484747..606f818ff0301bdc5d2e37d6a4273f7851c5b6e1 100644 --- a/nucleus/restconf_transport.go +++ b/nucleus/restconf_transport.go @@ -9,21 +9,21 @@ type Restconf struct { } func (r Restconf) Get(ctx context.Context, params ...string) (interface{}, error) { - panic("implement me") + return nil, &ErrNotYetImplemented{} } func (r Restconf) Set(ctx context.Context, params ...string) (interface{}, error) { - panic("implement me") + return nil, &ErrNotYetImplemented{} } func (r Restconf) Subscribe(ctx context.Context, params ...string) error { - panic("implement me") + return &ErrNotYetImplemented{} } func (r Restconf) Type() string { - panic("implement me") + return "restconf" } func (r Restconf) ProcessResponse(resp interface{}, root interface{}, models *ytypes.Schema) error { - panic("implement me") + return &ErrNotYetImplemented{} } diff --git a/nucleus/restconf_transport_test.go b/nucleus/restconf_transport_test.go new file mode 100644 index 0000000000000000000000000000000000000000..5f1eb1e352f2cb8214686c5215eea419c465dcd4 --- /dev/null +++ b/nucleus/restconf_transport_test.go @@ -0,0 +1,126 @@ +package nucleus + +import ( + "context" + "github.com/openconfig/ygot/ytypes" + "reflect" + "testing" +) + +func TestRestconf_Get(t *testing.T) { + type args struct { + ctx context.Context + params []string + } + tests := []struct { + name string + args args + want interface{} + wantErr bool + }{ + {name: "not implemented", args: args{}, want: nil, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := Restconf{} + got, err := r.Get(tt.args.ctx, tt.args.params...) + if (err != nil) != tt.wantErr { + t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Get() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestRestconf_ProcessResponse(t *testing.T) { + type args struct { + resp interface{} + root interface{} + models *ytypes.Schema + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "not implemented", args: args{}, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := Restconf{} + if err := r.ProcessResponse(tt.args.resp, tt.args.root, tt.args.models); (err != nil) != tt.wantErr { + t.Errorf("ProcessResponse() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRestconf_Set(t *testing.T) { + type args struct { + ctx context.Context + params []string + } + tests := []struct { + name string + args args + want interface{} + wantErr bool + }{ + {name: "not implemented", args: args{}, want: nil, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := Restconf{} + got, err := r.Set(tt.args.ctx, tt.args.params...) + if (err != nil) != tt.wantErr { + t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Set() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestRestconf_Subscribe(t *testing.T) { + type args struct { + ctx context.Context + params []string + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "not implemented", args: args{}, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := Restconf{} + if err := r.Subscribe(tt.args.ctx, tt.args.params...); (err != nil) != tt.wantErr { + t.Errorf("Subscribe() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRestconf_Type(t *testing.T) { + tests := []struct { + name string + want string + }{ + {name: "not implemented", want: "restconf"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := Restconf{} + if got := r.Type(); got != tt.want { + t.Errorf("Type() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/nucleus/southbound.go b/nucleus/southbound.go index 6d5db29f1deaffa4943bcda114dd6c78f194ab9b..88a6ed5f7353a719f51600862183830d1a5ef54e 100644 --- a/nucleus/southbound.go +++ b/nucleus/southbound.go @@ -1,13 +1,15 @@ package nucleus import ( - "code.fbi.h-da.de/cocsn/yang-models/generated/arista" "code.fbi.h-da.de/cocsn/yang-models/generated/openconfig" - log "github.com/golang/glog" "github.com/google/uuid" gpb "github.com/openconfig/gnmi/proto/gnmi" "github.com/openconfig/goyang/pkg/yang" + "github.com/openconfig/ygot/util" + "github.com/openconfig/ygot/ygot" "github.com/openconfig/ygot/ytypes" + log "github.com/sirupsen/logrus" + "reflect" ) // SouthboundInterface provides an @@ -47,6 +49,7 @@ func (oc *OpenConfig) SbiIdentifier() string { func (oc *OpenConfig) Schema() *ytypes.Schema { schema, err := openconfig.Schema() + oc.schema = schema if err != nil { log.Fatal(err) } @@ -65,45 +68,86 @@ func (oc *OpenConfig) SetNode() func(schema *yang.Entry, root interface{}, path } } -func (oc *OpenConfig) Id() uuid.UUID { - return oc.id -} - -// deprecated -// Use for prototyping only. -// Use OpenConfig instead -type AristaOC struct { - // deprecated - transport Transport - - schema *ytypes.Schema - id uuid.UUID -} - -func (oc *AristaOC) Id() uuid.UUID { - return oc.id +// Unmarshal injects OpenConfig specific model +// representation to the transport. +// Needed for type assertion. +func (oc *OpenConfig) Unmarshal() func([]byte, []string, interface{}, ...ytypes.UnmarshalOpt) error { + return unmarshal } -func (oc *AristaOC) SbiIdentifier() string { - return "arista" -} +// unmarshal parses a root or 1st level gNMI response to a go struct +// Named return due to how recover works here +func unmarshal(bytes []byte, fields []string, goStruct interface{}, opt ...ytypes.UnmarshalOpt) (err error) { + defer func() { + if r := recover(); r != nil { + err = r.(error) + } + }() + switch l := len(fields); l { + case 0: + return openconfig.Unmarshal(bytes, goStruct.(*openconfig.Device), opt...) + case 1: + default: + return &ErrUnsupportedPath{fields} + } + var c ygot.GoStruct + var field string -func (oc *AristaOC) Schema() *ytypes.Schema { - schema, err := arista.Schema() + // Load SBI definition + d := openconfig.Device{} + c, field, err = iter(&d, fields) if err != nil { - log.Fatal(err) + return } - return schema + if err = openconfig.Unmarshal(bytes, c, opt...); err != nil { + return + } + reflect.ValueOf(goStruct.(*openconfig.Device)).Elem().FieldByName(field).Set(reflect.ValueOf(c)) + return nil } -// SetNode injects AristaOC specific model -// representation to the transport. -// Needed for type assertion. -func (oc *AristaOC) SetNode() func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error { - return func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error { - if err := ytypes.SetNode(schema, root.(*arista.Device), path, val, opts...); err != nil { - return err +// iter walks down the provided paths and initializes the ygot.GoStruct. It only works for +// the root level. Watch out for named returns here +// TODO(mk): Fix deeper layers +func iter(a ygot.GoStruct, fields []string) (b ygot.GoStruct, f string, err error) { + defer func() { + if r := recover(); r != nil { + err = r.(error) } - return nil + }() + var c ygot.GoStruct + var configStruct reflect.Value + f = fields[0] + s := reflect.ValueOf(a).Elem() + h := s.FieldByName(f) + configStruct = reflect.New(h.Type()) + + // Pointer of field needs to be initialized. + // Very convoluted russian doll trick + // https://stackoverflow.com/a/57469950/4378176 + // https://golang.org/src/encoding/json/decode.go?s#L474 + // TODO(mk): Prettify + p2 := configStruct.Elem() + // If we have KeyHelperGoStruct we need make and modify map instead of plain struct + if p2.Kind() == reflect.Map { + p2.Set(reflect.MakeMap(p2.Type())) + configStruct.Elem().Set(p2) + if err := util.InsertIntoMapStructField(a, f, "", p2); err != nil { + panic(err) + } + } else { + configStruct.Elem().Set(reflect.New(p2.Type().Elem())) + b = configStruct.Elem().Interface().(ygot.GoStruct) + } + if len(fields) > 1 { + c, _, _ = iter(b, fields[1:]) + } else { + return } + reflect.ValueOf(b).Elem().FieldByName(f).Set(reflect.ValueOf(c)) + return +} + +func (oc *OpenConfig) Id() uuid.UUID { + return oc.id } diff --git a/nucleus/southbound_test.go b/nucleus/southbound_test.go index 0fa4ffa903a1f894325aaf5211341e19a2df754a..951f7979c30723e9b2ff281f30c69588529eea93 100644 --- a/nucleus/southbound_test.go +++ b/nucleus/southbound_test.go @@ -1 +1,229 @@ package nucleus + +import ( + "code.fbi.h-da.de/cocsn/gosdn/nucleus/util" + "code.fbi.h-da.de/cocsn/yang-models/generated/openconfig" + "github.com/google/uuid" + gpb "github.com/openconfig/gnmi/proto/gnmi" + "github.com/openconfig/ygot/ygot" + "github.com/openconfig/ygot/ytypes" + log "github.com/sirupsen/logrus" + "reflect" + "testing" +) + +func testSetupSbi() { + var err error + aristaUUID, err = uuid.Parse("d3795249-579c-4be7-8818-29f113cb86ee") + if err != nil { + log.Fatal(err) + } + + ocUUID, err = uuid.Parse("5e252b70-38f2-4c99-a0bf-1b16af4d7e67") + if err != nil { + log.Fatal(err) + } +} + +var aristaUUID uuid.UUID +var ocUUID uuid.UUID + +func TestOpenConfig_Id(t *testing.T) { + type fields struct { + transport Transport + schema *ytypes.Schema + id uuid.UUID + } + tests := []struct { + name string + fields fields + want uuid.UUID + }{ + { + name: "default", + fields: fields{ + transport: nil, + schema: nil, + id: ocUUID, + }, + want: ocUUID, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + oc := &OpenConfig{ + transport: tt.fields.transport, + schema: tt.fields.schema, + id: tt.fields.id, + } + if got := oc.Id(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("Id() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestOpenConfig_SbiIdentifier(t *testing.T) { + type fields struct { + transport Transport + schema *ytypes.Schema + id uuid.UUID + } + tests := []struct { + name string + fields fields + want string + }{ + {name: "default", fields: fields{}, want: "openconfig"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + oc := &OpenConfig{ + transport: tt.fields.transport, + schema: tt.fields.schema, + id: tt.fields.id, + } + if got := oc.SbiIdentifier(); got != tt.want { + t.Errorf("SbiIdentifier() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestOpenConfig_Schema(t *testing.T) { + schema, err := openconfig.Schema() + if err != nil { + t.Error(err) + } + type fields struct { + transport Transport + schema *ytypes.Schema + id uuid.UUID + } + tests := []struct { + name string + fields fields + want *ytypes.Schema + }{ + {name: "default", fields: fields{}, want: schema}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + oc := &OpenConfig{ + transport: tt.fields.transport, + schema: tt.fields.schema, + id: tt.fields.id, + } + got := oc.Schema().SchemaTree + if !reflect.DeepEqual(got, tt.want.SchemaTree) { + t.Errorf("Schema() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_unmarshal(t *testing.T) { + type args struct { + path string + goStruct interface{} + opt []ytypes.UnmarshalOpt + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "fail", + args: args{ + goStruct: &openconfig.Device{}, + path: "../test/resp-interfaces-interface-arista-ceos", + }, + wantErr: true, + }, + { + name: "root w/opts", + args: args{ + path: "../test/resp-full-node-arista-ceos", + goStruct: &openconfig.Device{}, + opt: []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}}, + }, + wantErr: false, + }, + { + name: "root w/o opts", + args: args{ + path: "../test/resp-full-node-arista-ceos", + goStruct: &openconfig.Device{}, + opt: nil, + }, + wantErr: true, + }, + { + name: "interfaces w/opts", + args: args{ + path: "../test/resp-interfaces-arista-ceos", + goStruct: &openconfig.Device{}, + opt: []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}}, + }, + wantErr: false, + }, + { + name: "interfaces w/o opts", + args: args{ + path: "../test/resp-interfaces-arista-ceos", + goStruct: &openconfig.Device{}, + opt: nil, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + resp := &gpb.GetResponse{} + err := util.Read(tt.args.path, resp) + if err != nil { + t.Error(err) + } + fields := extraxtPathElements(resp.Notification[0].Update[0].Path) + bytes := resp.Notification[0].Update[0].Val.GetJsonIetfVal() + if err := unmarshal(bytes, fields, tt.args.goStruct, tt.args.opt...); (err != nil) != tt.wantErr { + t.Errorf("unmarshal() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.args.goStruct.(*openconfig.Device).Interfaces == nil && tt.args.opt != nil { + t.Errorf("unmarshal() error: field Interfaces must not be nil") + } + }) + } +} + +func Test_iter(t *testing.T) { + type args struct { + a ygot.GoStruct + fields []string + } + tests := []struct { + name string + args args + wantB ygot.GoStruct + wantField string + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotB, gotField, err := iter(tt.args.a, tt.args.fields) + if (err != nil) != tt.wantErr { + t.Errorf("iter() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(gotB, tt.wantB) { + t.Errorf("iter() gotB = %v, want %v", gotB, tt.wantB) + } + if gotField != tt.wantField { + t.Errorf("iter() gotField = %v, want %v", gotField, tt.wantField) + } + }) + } +} diff --git a/nucleus/store_test.go b/nucleus/store_test.go index d8fc58121f653375e41e580941c158b01b0f6aea..defdaa58fa83bf01955cc18d361ce5c896162521 100644 --- a/nucleus/store_test.go +++ b/nucleus/store_test.go @@ -5,6 +5,7 @@ import ( "github.com/google/uuid" log "github.com/sirupsen/logrus" "reflect" + "sort" "testing" ) @@ -221,7 +222,14 @@ func Test_store_UUIDs(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := tt.s.UUIDs(); !reflect.DeepEqual(got, tt.want) { + sort.Slice(tt.want, func(i, j int) bool { + return tt.want[i].String() < tt.want[j].String() + }) + got := tt.s.UUIDs() + sort.Slice(got, func(i, j int) bool { + return got[i].String() < got[j].String() + }) + if !reflect.DeepEqual(got, tt.want) { t.Errorf("UUIDs() = %v, want %v", got, tt.want) } }) @@ -353,7 +361,7 @@ func Test_pndStore_get(t *testing.T) { }, }, }, - args: args{id: defaultPndId}, + args: args{id: did}, wantErr: true, }, } diff --git a/nucleus/transport.go b/nucleus/transport.go index 757ba085f51dbe50f00644ca7a7672bd917f6c5e..cfab425227534cea87a8d1a139fec97c5e499e42 100644 --- a/nucleus/transport.go +++ b/nucleus/transport.go @@ -12,7 +12,7 @@ import ( // or gnmi type Transport interface { Get(ctx context.Context, params ...string) (interface{}, error) - Set(ctx context.Context, params ...string) (interface{}, error) + Set(ctx context.Context, params ...interface{}) (interface{}, error) Subscribe(ctx context.Context, params ...string) error Type() string GetOptions() interface{} diff --git a/test/arista-interface-response.json b/test/arista-interface-response.json new file mode 100644 index 0000000000000000000000000000000000000000..392b21cd2158057613047b35794a42dddf1d35c4 --- /dev/null +++ b/test/arista-interface-response.json @@ -0,0 +1,238 @@ +[ + { + "time": "1970-01-01T01:00:00+01:00", + "updates": [ + { + "Path": "interfaces/interface[name=Ethernet510]", + "values": { + "interfaces/interface": { + "openconfig-if-ethernet:ethernet": { + "arista-intf-augments:pfc": { + "priorities": { + "priority": [ + { + "index": 0, + "state": { + "in-frames": "0", + "index": 0, + "out-frames": "0" + } + }, + { + "index": 1, + "state": { + "in-frames": "0", + "index": 1, + "out-frames": "0" + } + }, + { + "index": 2, + "state": { + "in-frames": "0", + "index": 2, + "out-frames": "0" + } + }, + { + "index": 3, + "state": { + "in-frames": "0", + "index": 3, + "out-frames": "0" + } + }, + { + "index": 4, + "state": { + "in-frames": "0", + "index": 4, + "out-frames": "0" + } + }, + { + "index": 5, + "state": { + "in-frames": "0", + "index": 5, + "out-frames": "0" + } + }, + { + "index": 6, + "state": { + "in-frames": "0", + "index": 6, + "out-frames": "0" + } + }, + { + "index": 7, + "state": { + "in-frames": "0", + "index": 7, + "out-frames": "0" + } + } + ] + } + }, + "config": { + "arista-intf-augments:fec-encoding": { + "disabled": false, + "fire-code": false, + "reed-solomon": false, + "reed-solomon544": false + }, + "arista-intf-augments:sfp-1000base-t": false, + "mac-address": "00:00:00:00:00:00", + "openconfig-hercules-interfaces:forwarding-viable": true, + "port-speed": "SPEED_UNKNOWN" + }, + "state": { + "arista-intf-augments:supported-speeds": [ + "SPEED_200GB_8LANE", + "SPEED_100MB", + "SPEED_1GB", + "SPEED_10GB", + "SPEED_400GB", + "SPEED_40GB", + "SPEED_2500MB", + "SPEED_50GB", + "SPEED_50GB_1LANE", + "SPEED_25GB", + "SPEED_100GB", + "SPEED_100GB_2LANE", + "SPEED_10MB", + "SPEED_200GB_4LANE", + "SPEED_5GB" + ], + "auto-negotiate": false, + "counters": { + "in-crc-errors": "0", + "in-fragment-frames": "0", + "in-jabber-frames": "0", + "in-mac-control-frames": "0", + "in-mac-pause-frames": "0", + "in-oversize-frames": "0", + "out-mac-control-frames": "0", + "out-mac-pause-frames": "0" + }, + "duplex-mode": "FULL", + "enable-flow-control": false, + "hw-mac-address": "02:42:c0:a8:02:42", + "mac-address": "02:42:c0:a8:02:42", + "negotiated-port-speed": "SPEED_UNKNOWN", + "openconfig-hercules-interfaces:forwarding-viable": true, + "port-speed": "SPEED_UNKNOWN" + } + }, + "openconfig-interfaces:config": { + "arista-intf-augments:load-interval": 300, + "description": "", + "enabled": true, + "loopback-mode": false, + "mtu": 0, + "name": "Ethernet510", + "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100", + "type": "iana-if-type:ethernetCsmacd" + }, + "openconfig-interfaces:hold-time": { + "config": { + "down": 0, + "up": 0 + }, + "state": { + "down": 0, + "up": 0 + } + }, + "openconfig-interfaces:name": "Ethernet510", + "openconfig-interfaces:state": { + "admin-status": "UP", + "arista-intf-augments:inactive": false, + "counters": { + "in-broadcast-pkts": "344691", + "in-discards": "0", + "in-errors": "0", + "in-fcs-errors": "0", + "in-multicast-pkts": "1", + "in-octets": "93260151", + "in-unicast-pkts": "0", + "out-broadcast-pkts": "0", + "out-discards": "0", + "out-errors": "0", + "out-multicast-pkts": "0", + "out-octets": "0", + "out-unicast-pkts": "0" + }, + "description": "", + "enabled": true, + "ifindex": 510, + "last-change": "1614091948142304000", + "loopback-mode": false, + "mtu": 0, + "name": "Ethernet510", + "openconfig-platform-port:hardware-port": "Port510", + "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100", + "oper-status": "UP", + "type": "iana-if-type:ethernetCsmacd" + }, + "openconfig-interfaces:subinterfaces": { + "subinterface": [ + { + "config": { + "description": "", + "enabled": true, + "index": 0 + }, + "index": 0, + "openconfig-if-ip:ipv4": { + "config": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "state": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "unnumbered": { + "config": { + "enabled": false + }, + "state": { + "enabled": false + } + } + }, + "openconfig-if-ip:ipv6": { + "config": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "state": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + } + }, + "state": { + "counters": { + "in-fcs-errors": "0" + }, + "description": "", + "enabled": true, + "index": 0 + } + } + ] + } + } + } + } + ] + } +] diff --git a/test/arista-interface-response2.json b/test/arista-interface-response2.json new file mode 100644 index 0000000000000000000000000000000000000000..490099db940c125dfb69b3570764886a2f20a6e2 --- /dev/null +++ b/test/arista-interface-response2.json @@ -0,0 +1,242 @@ +[ + { + "time": "1970-01-01T01:00:00+01:00", + "updates": [ + { + "Path": "interfaces", + "values": { + "interfaces": { + "openconfig-interfaces:interface": [ + { + "config": { + "arista-intf-augments:load-interval": 300, + "description": "", + "enabled": true, + "loopback-mode": false, + "mtu": 0, + "name": "Ethernet510", + "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100", + "type": "iana-if-type:ethernetCsmacd" + }, + "hold-time": { + "config": { + "down": 0, + "up": 0 + }, + "state": { + "down": 0, + "up": 0 + } + }, + "name": "Ethernet510", + "openconfig-if-ethernet:ethernet": { + "arista-intf-augments:pfc": { + "priorities": { + "priority": [ + { + "index": 0, + "state": { + "in-frames": "0", + "index": 0, + "out-frames": "0" + } + }, + { + "index": 1, + "state": { + "in-frames": "0", + "index": 1, + "out-frames": "0" + } + }, + { + "index": 2, + "state": { + "in-frames": "0", + "index": 2, + "out-frames": "0" + } + }, + { + "index": 3, + "state": { + "in-frames": "0", + "index": 3, + "out-frames": "0" + } + }, + { + "index": 4, + "state": { + "in-frames": "0", + "index": 4, + "out-frames": "0" + } + }, + { + "index": 5, + "state": { + "in-frames": "0", + "index": 5, + "out-frames": "0" + } + }, + { + "index": 6, + "state": { + "in-frames": "0", + "index": 6, + "out-frames": "0" + } + }, + { + "index": 7, + "state": { + "in-frames": "0", + "index": 7, + "out-frames": "0" + } + } + ] + } + }, + "config": { + "arista-intf-augments:fec-encoding": { + "disabled": false, + "fire-code": false, + "reed-solomon": false, + "reed-solomon544": false + }, + "arista-intf-augments:sfp-1000base-t": false, + "mac-address": "00:00:00:00:00:00", + "openconfig-hercules-interfaces:forwarding-viable": true, + "port-speed": "SPEED_UNKNOWN" + }, + "state": { + "arista-intf-augments:supported-speeds": [ + "SPEED_200GB_8LANE", + "SPEED_100MB", + "SPEED_1GB", + "SPEED_10GB", + "SPEED_400GB", + "SPEED_40GB", + "SPEED_2500MB", + "SPEED_50GB", + "SPEED_50GB_1LANE", + "SPEED_25GB", + "SPEED_100GB", + "SPEED_100GB_2LANE", + "SPEED_10MB", + "SPEED_200GB_4LANE", + "SPEED_5GB" + ], + "auto-negotiate": false, + "counters": { + "in-crc-errors": "0", + "in-fragment-frames": "0", + "in-jabber-frames": "0", + "in-mac-control-frames": "0", + "in-mac-pause-frames": "0", + "in-oversize-frames": "0", + "out-mac-control-frames": "0", + "out-mac-pause-frames": "0" + }, + "duplex-mode": "FULL", + "enable-flow-control": false, + "hw-mac-address": "02:42:c0:a8:02:42", + "mac-address": "02:42:c0:a8:02:42", + "negotiated-port-speed": "SPEED_UNKNOWN", + "openconfig-hercules-interfaces:forwarding-viable": true, + "port-speed": "SPEED_UNKNOWN" + } + }, + "state": { + "admin-status": "UP", + "arista-intf-augments:inactive": false, + "counters": { + "in-broadcast-pkts": "344691", + "in-discards": "0", + "in-errors": "0", + "in-fcs-errors": "0", + "in-multicast-pkts": "1", + "in-octets": "93260151", + "in-unicast-pkts": "0", + "out-broadcast-pkts": "0", + "out-discards": "0", + "out-errors": "0", + "out-multicast-pkts": "0", + "out-octets": "0", + "out-unicast-pkts": "0" + }, + "description": "", + "enabled": true, + "ifindex": 510, + "last-change": "1614091948142304000", + "loopback-mode": false, + "mtu": 0, + "name": "Ethernet510", + "openconfig-platform-port:hardware-port": "Port510", + "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100", + "oper-status": "UP", + "type": "iana-if-type:ethernetCsmacd" + }, + "subinterfaces": { + "subinterface": [ + { + "config": { + "description": "", + "enabled": true, + "index": 0 + }, + "index": 0, + "openconfig-if-ip:ipv4": { + "config": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "state": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "unnumbered": { + "config": { + "enabled": false + }, + "state": { + "enabled": false + } + } + }, + "openconfig-if-ip:ipv6": { + "config": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "state": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + } + }, + "state": { + "counters": { + "in-fcs-errors": "0" + }, + "description": "", + "enabled": true, + "index": 0 + } + } + ] + } + } + ] + } + } + } + ] + } +] diff --git a/test/arista-root-response.json b/test/arista-root-response.json new file mode 100644 index 0000000000000000000000000000000000000000..ddbe90101c9aae11f0447100bbc32b593c5bf781 --- /dev/null +++ b/test/arista-root-response.json @@ -0,0 +1,6744 @@ +[ + { + "time": "1970-01-01T01:00:00+01:00", + "updates": [ + { + "Path": "", + "values": { + "": { + "arista-exp-eos:arista": { + "eos": { + "arista-exp-eos-igmpsnooping:bridging": { + "igmpsnooping": { + "config": {} + } + }, + "arista-exp-eos-mlag:mlag": { + "config": { + "dual-primary-action": "action-none", + "enabled": true, + "heartbeat-interval": 4000, + "heartbeat-peer-address": { + "address": "0.0.0.0", + "vrf": "" + }, + "lacp-standby": false, + "reload-delay-mlag-configured": false + } + }, + "arista-exp-eos-multicast:routing": { + "multicast": { + "routeconfig": { + "static": { + "vrfConfig": [ + { + "vrfName": "default" + } + ] + } + } + } + }, + "arista-exp-eos-qos:qos": { + "arista-exp-eos-qos-acl-config:acl": { + "input": { + "cli": { + "cmapType": [ + { + "cmap": [ + { + "matchCondition": "matchConditionAny", + "name": "copp-system-rsvp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-unicastarp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l2broadcast" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-multicastsnoop" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mlag" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-igmp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l3destmiss" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-acllog-sflow" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ipunicast" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-default-snoop" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-tc6to7" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mac-learn" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-vxlan-vtep-learn" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mvrp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l3lpmoverflow" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l3slowpath" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-cfm-snoop" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-bgp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mod" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-vrrp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ldp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-linklocal" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-protocol-snoop" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-cvx" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-PimPtp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ipmc" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ipbroadcast" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-acllog" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-iplocking" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-bfd-ptp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ipv6nd" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-dot1x-mba" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ipmcrsvd" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-arpresolver" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-cvx-heartbeat" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-bpdu" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-nat" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-drop" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-vxlan-encapsulation" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ptp-snoop" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-sflow" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mpls-arp-suppress" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-lldp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l3ttl0" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mpls-ttl01" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-lacp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-cfm" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l3ttl1" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-tc3to5" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l2ucast" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mirroring" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mtu" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l3rsvd" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-dot1x-vxlan" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-bfd" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-glean" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-arp-inspect" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-l2rsvd" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-pim" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ipmcmiss" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-egress-acllog" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-selfip-tc6to7" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-selfip" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-ptp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-arp" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-OspfIsis" + }, + { + "matchCondition": "matchConditionAny", + "name": "copp-system-mpls-label-miss" + } + ], + "type": "mapControlPlane" + }, + { + "cmap": [ + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "vrrp" + } + ], + "matchCondition": "matchConditionAny", + "name": "vrrp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "layer2-broadcast" + } + ], + "matchCondition": "matchConditionAny", + "name": "layer2-broadcast" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "lldp" + } + ], + "matchCondition": "matchConditionAny", + "name": "lldp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "link-local-multicast" + } + ], + "matchCondition": "matchConditionAny", + "name": "link-local-multicast" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "ospf" + } + ], + "matchCondition": "matchConditionAny", + "name": "ospf" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "igmp" + } + ], + "matchCondition": "matchConditionAny", + "name": "igmp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "bpdu" + } + ], + "matchCondition": "matchConditionAny", + "name": "bpdu" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "unicast-rpf-failure" + } + ], + "matchCondition": "matchConditionAny", + "name": "unicast-rpf-failure" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "layer3-control" + } + ], + "matchCondition": "matchConditionAny", + "name": "layer3-control" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "lacp" + } + ], + "matchCondition": "matchConditionAny", + "name": "lacp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "natTcpFlags" + } + ], + "matchCondition": "matchConditionAny", + "name": "natTcpFlags" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "self-ip-all" + } + ], + "matchCondition": "matchConditionAny", + "name": "self-ip-all" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "arp-needed" + } + ], + "matchCondition": "matchConditionAny", + "name": "arp-needed" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "self-ip-high-priority" + } + ], + "matchCondition": "matchConditionAny", + "name": "self-ip-high-priority" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "unicast-route-miss" + } + ], + "matchCondition": "matchConditionAny", + "name": "unicast-route-miss" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "nat-miss" + } + ], + "matchCondition": "matchConditionAny", + "name": "nat-miss" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "bfd" + } + ], + "matchCondition": "matchConditionAny", + "name": "bfd" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "cfm" + } + ], + "matchCondition": "matchConditionAny", + "name": "cfm" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "self-icmp" + } + ], + "matchCondition": "matchConditionAny", + "name": "self-icmp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "self-ip-low-priority" + } + ], + "matchCondition": "matchConditionAny", + "name": "self-ip-low-priority" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "dhcp" + } + ], + "matchCondition": "matchConditionAny", + "name": "dhcp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "pim" + } + ], + "matchCondition": "matchConditionAny", + "name": "pim" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "pvst" + } + ], + "matchCondition": "matchConditionAny", + "name": "pvst" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "vxlan-vtep-learn" + } + ], + "matchCondition": "matchConditionAny", + "name": "vxlan-vtep-learn" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "ttl-exception" + } + ], + "matchCondition": "matchConditionAny", + "name": "ttl-exception" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "arp" + } + ], + "matchCondition": "matchConditionAny", + "name": "arp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "layer3-slow-path" + } + ], + "matchCondition": "matchConditionAny", + "name": "layer3-slow-path" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "ip-broadcast" + } + ], + "matchCondition": "matchConditionAny", + "name": "ip-broadcast" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "multicast-route-miss" + } + ], + "matchCondition": "matchConditionAny", + "name": "multicast-route-miss" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "layer2-control" + } + ], + "matchCondition": "matchConditionAny", + "name": "layer2-control" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "mac-source-miss" + } + ], + "matchCondition": "matchConditionAny", + "name": "mac-source-miss" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "mvrp" + } + ], + "matchCondition": "matchConditionAny", + "name": "mvrp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "mlag-control" + } + ], + "matchCondition": "matchConditionAny", + "name": "mlag-control" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "mpls-route-miss" + } + ], + "matchCondition": "matchConditionAny", + "name": "mpls-route-miss" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "mstp" + } + ], + "matchCondition": "matchConditionAny", + "name": "mstp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "dot1xMBA" + } + ], + "matchCondition": "matchConditionAny", + "name": "dot1xMBA" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "unicast-route-overflow" + } + ], + "matchCondition": "matchConditionAny", + "name": "unicast-route-overflow" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "mlag-control-heartbeat" + } + ], + "matchCondition": "matchConditionAny", + "name": "mlag-control-heartbeat" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "self-bgp" + } + ], + "matchCondition": "matchConditionAny", + "name": "self-bgp" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "ipv6-nd" + } + ], + "matchCondition": "matchConditionAny", + "name": "ipv6-nd" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "vxlan-encapsulation" + } + ], + "matchCondition": "matchConditionAny", + "name": "vxlan-encapsulation" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "cvx" + } + ], + "matchCondition": "matchConditionAny", + "name": "cvx" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "routed-ip-options" + } + ], + "matchCondition": "matchConditionAny", + "name": "routed-ip-options" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "isis" + } + ], + "matchCondition": "matchConditionAny", + "name": "isis" + }, + { + "match": [ + { + "option": "matchBuiltIn", + "strValue": "ptp" + } + ], + "matchCondition": "matchConditionAny", + "name": "ptp" + } + ], + "type": "mapPdp" + }, + { + "type": "mapQos" + } + ], + "pmapType": [ + { + "pmap": [ + { + "classAction": [ + { + "name": "copp-system-OspfIsis", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-l3lpmoverflow", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-linklocal", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-nat", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-ipmcmiss", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-drop", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-cfm", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-ipmc", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mod", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-acllog", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-tc3to5", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-bpdu", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mirroring", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-bfd-ptp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mlag", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-cvx", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-vrrp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-igmp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-default-snoop", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-ipbroadcast", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-bfd", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mpls-ttl01", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-l3destmiss", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-iplocking", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mac-learn", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-l3ttl1", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-arp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-cvx-heartbeat", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-egress-acllog", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-lacp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-l2rsvd", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-ipmcrsvd", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-vxlan-encapsulation", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-dot1x-mba", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-ptp-snoop", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-cfm-snoop", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-vxlan-vtep-learn", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-l2broadcast", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mpls-arp-suppress", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-lldp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-glean", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-ipunicast", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-multicastsnoop", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-pim", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-selfip-tc6to7", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-selfip", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-PimPtp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-arpresolver", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-ptp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-ldp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-acllog-sflow", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mtu", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-arp-inspect", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-rsvp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mvrp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-unicastarp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-l3slowpath", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-mpls-label-miss", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-bgp", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-l3ttl0", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-ipv6nd", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-sflow", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-l3rsvd", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-dot1x-vxlan", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + { + "name": "copp-system-l2ucast", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-tc6to7", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetBandwidth", + "rate": {} + }, + { + "actionType": "actionSetShape", + "rate": {} + } + ] + }, + { + "name": "copp-system-protocol-snoop", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + } + ], + "classActionDefault": { + "name": "copp-system-default", + "policer": { + "cmdVersion": 1 + }, + "policyAction": [ + { + "actionType": "actionSetShape", + "rate": {} + }, + { + "actionType": "actionSetBandwidth", + "rate": {} + } + ] + }, + "classDefault": { + "match": [ + { + "option": "matchIpAccessGroup" + } + ] + }, + "coppStaticClassPrio": [ + { + "index": 25 + }, + { + "index": 21 + }, + { + "index": 19 + }, + { + "index": 55 + }, + { + "index": 62 + }, + { + "index": 10 + }, + { + "index": 15 + }, + { + "index": 49 + }, + { + "index": 31 + }, + { + "index": 58 + }, + { + "index": 30 + }, + { + "index": 14 + }, + { + "index": 41 + }, + { + "index": 56 + }, + { + "index": 36 + }, + { + "index": 16 + }, + { + "index": 48 + }, + { + "index": 64 + }, + { + "index": 39 + }, + { + "index": 27 + }, + { + "index": 8 + }, + { + "index": 9 + }, + { + "index": 2 + }, + { + "index": 54 + }, + { + "index": 35 + }, + { + "index": 3 + }, + { + "index": 29 + }, + { + "index": 59 + }, + { + "index": 33 + }, + { + "index": 18 + }, + { + "index": 42 + }, + { + "index": 7 + }, + { + "index": 24 + }, + { + "index": 61 + }, + { + "index": 38 + }, + { + "index": 53 + }, + { + "index": 66 + }, + { + "index": 32 + }, + { + "index": 37 + }, + { + "index": 52 + }, + { + "index": 51 + }, + { + "index": 40 + }, + { + "index": 13 + }, + { + "index": 12 + }, + { + "index": 5 + }, + { + "index": 4 + }, + { + "index": 34 + }, + { + "index": 45 + }, + { + "index": 11 + }, + { + "index": 26 + }, + { + "index": 28 + }, + { + "index": 67 + }, + { + "index": 46 + }, + { + "index": 17 + }, + { + "index": 65 + }, + { + "index": 63 + }, + { + "index": 50 + }, + { + "index": 57 + }, + { + "index": 23 + }, + { + "index": 1 + }, + { + "index": 60 + }, + { + "index": 47 + }, + { + "index": 22 + }, + { + "index": 44 + }, + { + "index": 20 + }, + { + "index": 6 + }, + { + "index": 43 + } + ], + "name": "copp-system-policy" + } + ], + "type": "mapControlPlane" + }, + { + "type": "mapPdp" + }, + { + "type": "mapQos" + } + ] + } + } + }, + "arista-exp-eos-qos-config:input": { + "config": { + "cli": { + "servicePolicyConfig": [ + { + "key-direction": "input", + "key-pmapName": "copp-system-policy", + "key-type": "mapControlPlane" + } + ] + } + } + } + } + } + }, + "arista-gnoi-cert:certificates": { + "certificate": [ + { + "certificate-id": "ARISTA_DEFAULT_PROFILE", + "config": { + "certificate-id": "ARISTA_DEFAULT_PROFILE" + }, + "status": { + "not-after": 0, + "not-before": 0, + "pem-certificate": "" + } + } + ] + }, + "ietf-netconf-monitoring:netconf-state": { + "capabilities": { + "capability": [ + "http://arista.com/yang/cert/gnoi-cert?module=arista-gnoi-cert\u0026revision=2018-01-15", + "http://arista.com/yang/cli?module=arista-cli\u0026revision=2020-02-11", + "http://arista.com/yang/experimental/eos/eos-types?module=arista-eos-types\u0026revision=2016-10-14", + "http://arista.com/yang/experimental/eos/evpn?module=arista-exp-eos-evpn\u0026revision=2020-07-31", + "http://arista.com/yang/experimental/eos/l2protocolforwarding?module=arista-exp-eos-l2protocolforwarding\u0026revision=2020-04-16", + "http://arista.com/yang/experimental/eos/qos/acl?module=arista-exp-eos-qos-acl-config\u0026revision=2019-11-12", + "http://arista.com/yang/experimental/eos/qos/config?module=arista-exp-eos-qos-config\u0026revision=2017-09-26", + "http://arista.com/yang/experimental/eos/qos?module=arista-exp-eos-qos\u0026revision=2017-09-26", + "http://arista.com/yang/experimental/eos/varp/intf?module=arista-exp-eos-varp-intf\u0026revision=2020-01-06", + "http://arista.com/yang/experimental/eos/varp/net-inst?module=arista-exp-eos-varp-net-inst\u0026revision=2019-05-22", + "http://arista.com/yang/experimental/eos/vxlan/config?module=arista-exp-eos-vxlan-config\u0026revision=2018-08-01", + "http://arista.com/yang/experimental/eos/vxlan?module=arista-exp-eos-vxlan\u0026revision=2018-08-01", + "http://arista.com/yang/experimental/eos?module=arista-exp-eos\u0026revision=2016-11-09", + "http://arista.com/yang/experimental/igmpsnooping?module=arista-exp-eos-igmpsnooping\u0026revision=2017-10-23", + "http://arista.com/yang/experimental/multicast?module=arista-exp-eos-multicast\u0026revision=2017-10-20", + "http://arista.com/yang/openconfig/acl/deviations?module=arista-acl-deviations\u0026revision=2020-01-07", + "http://arista.com/yang/openconfig/acl/notsupported-deviations?module=arista-acl-notsupported-deviations\u0026revision=2020-02-04", + "http://arista.com/yang/openconfig/aft/augments?module=arista-aft-augments\u0026revision=2019-10-01", + "http://arista.com/yang/openconfig/bfd/augments?module=arista-bfd-augments\u0026revision=2020-01-06", + "http://arista.com/yang/openconfig/bfd/deviations?module=arista-bfd-deviations\u0026revision=2018-08-08", + "http://arista.com/yang/openconfig/bfd/notsupported-deviations?module=arista-bfd-notsupported-deviations\u0026revision=2020-02-04", + "http://arista.com/yang/openconfig/bgp/augments?module=arista-bgp-augments\u0026revision=2020-05-27", + "http://arista.com/yang/openconfig/bgp/deviations?module=arista-bgp-deviations\u0026revision=2020-05-27", + "http://arista.com/yang/openconfig/bgp/notsupported-deviations?module=arista-bgp-notsupported-deviations\u0026revision=2020-02-04", + "http://arista.com/yang/openconfig/interfaces/augments?module=arista-intf-augments\u0026revision=2020-05-13", + "http://arista.com/yang/openconfig/interfaces/deviations?module=arista-intf-deviations\u0026revision=2020-04-02", + "http://arista.com/yang/openconfig/interfaces/notsupported-deviations?module=arista-interfaces-notsupported-deviations\u0026revision=2020-03-27", + "http://arista.com/yang/openconfig/isis/augments?module=arista-isis-augments\u0026revision=2020-03-18", + "http://arista.com/yang/openconfig/isis/deviations?module=arista-isis-deviations\u0026revision=2019-05-14", + "http://arista.com/yang/openconfig/lacp/augments?module=arista-lacp-augments\u0026revision=2017-09-14", + "http://arista.com/yang/openconfig/lacp/deviations?module=arista-lacp-deviations\u0026revision=2017-09-07", + "http://arista.com/yang/openconfig/lacp/notsupported-deviations?module=arista-lacp-notsupported-deviations\u0026revision=2020-02-04", + "http://arista.com/yang/openconfig/lldp/augments?module=arista-lldp-augments\u0026revision=2018-03-06", + "http://arista.com/yang/openconfig/lldp/deviations?module=arista-lldp-deviations\u0026revision=2018-04-02", + "http://arista.com/yang/openconfig/lldp/notsupported-deviations?module=arista-lldp-notsupported-deviations\u0026revision=2020-02-04", + "http://arista.com/yang/openconfig/local-routing/deviations?module=arista-local-routing-deviations\u0026revision=2017-11-22", + "http://arista.com/yang/openconfig/local-routing/notsupported-deviations?module=arista-local-routing-notsupported-deviations\u0026revision=2020-02-04", + "http://arista.com/yang/openconfig/messages/notsupported-deviations?module=arista-messages-notsupported-deviations\u0026revision=2020-02-04", + "http://arista.com/yang/openconfig/mpls/augments?module=arista-mpls-augments\u0026revision=2017-12-21", + "http://arista.com/yang/openconfig/mpls/deviations?module=arista-mpls-deviations\u0026revision=2018-03-19", + "http://arista.com/yang/openconfig/network-instance/deviations?module=arista-vlan-deviations\u0026revision=2019-11-13", + "http://arista.com/yang/openconfig/network-instance/notsupported-deviations?module=arista-network-instance-notsupported-deviations\u0026revision=2020-07-31", + "http://arista.com/yang/openconfig/network-instance/vlan/augments?module=arista-vlan-augments\u0026revision=2020-01-06", + "http://arista.com/yang/openconfig/network-instances/deviations?module=arista-netinst-deviations\u0026revision=2019-05-24", + "http://arista.com/yang/openconfig/openflow/deviations?module=arista-openflow-deviations\u0026revision=2020-02-26", + "http://arista.com/yang/openconfig/pim/augments?module=arista-pim-augments\u0026revision=2019-04-24", + "http://arista.com/yang/openconfig/platform/notsupported-deviations?module=arista-platform-notsupported-deviations\u0026revision=2020-07-13", + "http://arista.com/yang/openconfig/policy-forwarding/augments?module=arista-srte-augments\u0026revision=2020-01-28", + "http://arista.com/yang/openconfig/policy-forwarding/augments?module=arista-srte-deviations\u0026revision=2020-03-03", + "http://arista.com/yang/openconfig/policy/augments?module=arista-rpol-augments\u0026revision=2018-04-12", + "http://arista.com/yang/openconfig/policy/deviations?module=arista-rpol-deviations\u0026revision=2016-02-01", + "http://arista.com/yang/openconfig/qos/augments?module=arista-qos-augments\u0026revision=2020-06-05", + "http://arista.com/yang/openconfig/qos/notsupported-deviations?module=arista-qos-notsupported-deviations\u0026revision=2020-06-10", + "http://arista.com/yang/openconfig/relay-agent/deviations?module=arista-relay-agent-deviations\u0026revision=2016-11-21", + "http://arista.com/yang/openconfig/routing-policy/notsupported-deviations?module=arista-routing-policy-notsupported-deviations\u0026revision=2020-02-07", + "http://arista.com/yang/openconfig/system/augments?module=arista-system-augments\u0026revision=2020-03-09", + "http://arista.com/yang/openconfig/system/deviations?module=arista-system-deviations\u0026revision=2020-01-21", + "http://arista.com/yang/openconfig/system/notsupported-deviations?module=arista-system-notsupported-deviations\u0026revision=2020-03-26", + "http://arista.com/yang/rpc/netconf?module=arista-rpc-netconf\u0026revision=2018-01-04", + "http://arista.com/yang/vlan-translation?module=vlan-translation\u0026revision=2019-07-31", + "http://openconfig.net/yang/aaa/types?module=openconfig-aaa-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/aaa?module=openconfig-aaa\u0026revision=2019-10-28", + "http://openconfig.net/yang/aaa?module=openconfig-aaa-radius\u0026revision=2018-11-21", + "http://openconfig.net/yang/aaa?module=openconfig-aaa-tacacs\u0026revision=2018-11-21", + "http://openconfig.net/yang/acl?module=openconfig-acl\u0026revision=2019-11-27", + "http://openconfig.net/yang/aft?module=openconfig-aft\u0026revision=2019-11-07", + "http://openconfig.net/yang/aft?module=openconfig-aft-common\u0026revision=2019-11-07", + "http://openconfig.net/yang/aft?module=openconfig-aft-ethernet\u0026revision=2019-11-07", + "http://openconfig.net/yang/aft?module=openconfig-aft-ipv4\u0026revision=2019-11-07", + "http://openconfig.net/yang/aft?module=openconfig-aft-ipv6\u0026revision=2019-11-07", + "http://openconfig.net/yang/aft?module=openconfig-aft-mpls\u0026revision=2019-11-07", + "http://openconfig.net/yang/aft?module=openconfig-aft-pf\u0026revision=2019-11-07", + "http://openconfig.net/yang/alarms/types?module=openconfig-alarm-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/alarms?module=openconfig-alarms\u0026revision=2019-07-09", + "http://openconfig.net/yang/bfd?module=openconfig-bfd\u0026revision=2020-05-08", + "http://openconfig.net/yang/bgp-policy?module=openconfig-bgp-policy\u0026revision=2019-11-28", + "http://openconfig.net/yang/bgp-types?module=openconfig-bgp-errors\u0026revision=2018-11-21", + "http://openconfig.net/yang/bgp-types?module=openconfig-bgp-types\u0026revision=2020-06-17", + "http://openconfig.net/yang/bgp?module=openconfig-bgp\u0026revision=2019-07-10", + "http://openconfig.net/yang/bgp?module=openconfig-bgp-common\u0026revision=2019-07-10", + "http://openconfig.net/yang/bgp?module=openconfig-bgp-common-multiprotocol\u0026revision=2019-07-10", + "http://openconfig.net/yang/bgp?module=openconfig-bgp-common-structure\u0026revision=2019-07-10", + "http://openconfig.net/yang/bgp?module=openconfig-bgp-global\u0026revision=2019-07-10", + "http://openconfig.net/yang/bgp?module=openconfig-bgp-neighbor\u0026revision=2019-07-10", + "http://openconfig.net/yang/bgp?module=openconfig-bgp-peer-group\u0026revision=2019-07-10", + "http://openconfig.net/yang/fib-types?module=openconfig-aft-types\u0026revision=2019-11-07", + "http://openconfig.net/yang/header-fields?module=openconfig-packet-match\u0026revision=2018-11-21", + "http://openconfig.net/yang/hercules/interfaces?module=openconfig-hercules-interfaces\u0026revision=2018-06-01", + "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform\u0026revision=2018-06-01", + "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform-chassis\u0026revision=2018-06-01", + "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform-linecard\u0026revision=2018-06-01", + "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform-node\u0026revision=2018-06-01", + "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform-port\u0026revision=2018-06-01", + "http://openconfig.net/yang/hercules/qos?module=openconfig-hercules-qos\u0026revision=2018-06-01", + "http://openconfig.net/yang/igmp/types?module=openconfig-igmp-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/igmp?module=openconfig-igmp\u0026revision=2019-07-09", + "http://openconfig.net/yang/interfaces/aggregate?module=openconfig-if-aggregate\u0026revision=2020-05-01", + "http://openconfig.net/yang/interfaces/ethernet?module=openconfig-if-ethernet\u0026revision=2020-05-06", + "http://openconfig.net/yang/interfaces/ip?module=openconfig-if-ip\u0026revision=2019-01-08", + "http://openconfig.net/yang/interfaces/tunnel?module=openconfig-if-tunnel\u0026revision=2018-11-21", + "http://openconfig.net/yang/interfaces?module=openconfig-interfaces\u0026revision=2019-11-19", + "http://openconfig.net/yang/isis-lsdb-types?module=openconfig-isis-lsdb-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/isis-types?module=openconfig-isis-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/lacp?module=openconfig-lacp\u0026revision=2018-11-21", + "http://openconfig.net/yang/ldp?module=openconfig-mpls-ldp\u0026revision=2019-07-09", + "http://openconfig.net/yang/license?module=openconfig-license\u0026revision=2020-04-22", + "http://openconfig.net/yang/lldp/types?module=openconfig-lldp-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/lldp?module=openconfig-lldp\u0026revision=2018-11-21", + "http://openconfig.net/yang/local-routing?module=openconfig-local-routing\u0026revision=2020-03-24", + "http://openconfig.net/yang/messages?module=openconfig-messages\u0026revision=2018-08-13", + "http://openconfig.net/yang/mpls-sr?module=openconfig-mpls-sr\u0026revision=2018-11-21", + "http://openconfig.net/yang/mpls-types?module=openconfig-mpls-types\u0026revision=2020-02-04", + "http://openconfig.net/yang/mpls?module=openconfig-mpls\u0026revision=2019-03-26", + "http://openconfig.net/yang/mpls?module=openconfig-mpls-igp\u0026revision=2018-11-21", + "http://openconfig.net/yang/mpls?module=openconfig-mpls-static\u0026revision=2018-11-21", + "http://openconfig.net/yang/mpls?module=openconfig-mpls-te\u0026revision=2018-11-21", + "http://openconfig.net/yang/network-instance-l3?module=openconfig-network-instance-l3\u0026revision=2018-11-21", + "http://openconfig.net/yang/network-instance-types?module=openconfig-network-instance-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/network-instance?module=openconfig-network-instance\u0026revision=2020-06-20", + "http://openconfig.net/yang/network-instance?module=openconfig-network-instance-l2\u0026revision=2020-06-20", + "http://openconfig.net/yang/openconfig-ext?module=openconfig-extensions\u0026revision=2018-10-17", + "http://openconfig.net/yang/openconfig-if-types?module=openconfig-if-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/openconfig-isis?module=openconfig-isis\u0026revision=2020-03-24", + "http://openconfig.net/yang/openconfig-isis?module=openconfig-isis-lsp\u0026revision=2020-03-24", + "http://openconfig.net/yang/openconfig-isis?module=openconfig-isis-routing\u0026revision=2020-03-24", + "http://openconfig.net/yang/openconfig-types?module=openconfig-types\u0026revision=2019-04-16", + "http://openconfig.net/yang/openflow/types?module=openconfig-openflow-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/openflow?module=openconfig-openflow\u0026revision=2018-11-21", + "http://openconfig.net/yang/ospf-policy?module=openconfig-ospf-policy\u0026revision=2018-11-21", + "http://openconfig.net/yang/ospf-types?module=openconfig-ospf-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2\u0026revision=2019-11-28", + "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-area\u0026revision=2019-11-28", + "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-area-interface\u0026revision=2019-11-28", + "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-common\u0026revision=2019-11-28", + "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-global\u0026revision=2019-11-28", + "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-lsdb\u0026revision=2019-11-28", + "http://openconfig.net/yang/packet-match-types?module=openconfig-packet-match-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/pim/types?module=openconfig-pim-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/pim?module=openconfig-pim\u0026revision=2019-07-09", + "http://openconfig.net/yang/platform-types?module=openconfig-platform-types\u0026revision=2019-06-03", + "http://openconfig.net/yang/platform/cpu?module=openconfig-platform-cpu\u0026revision=2018-11-21", + "http://openconfig.net/yang/platform/fan?module=openconfig-platform-fan\u0026revision=2018-11-21", + "http://openconfig.net/yang/platform/linecard?module=openconfig-platform-linecard\u0026revision=2020-05-10", + "http://openconfig.net/yang/platform/port?module=openconfig-platform-port\u0026revision=2020-05-06", + "http://openconfig.net/yang/platform/psu?module=openconfig-platform-psu\u0026revision=2018-11-21", + "http://openconfig.net/yang/platform/transceiver?module=openconfig-platform-transceiver\u0026revision=2020-05-06", + "http://openconfig.net/yang/platform?module=openconfig-platform\u0026revision=2019-04-16", + "http://openconfig.net/yang/poe?module=openconfig-if-poe\u0026revision=2018-11-21", + "http://openconfig.net/yang/policy-forwarding/sr-te?module=openconfig-pf-srte\u0026revision=2019-10-15", + "http://openconfig.net/yang/policy-forwarding?module=openconfig-pf-forwarding-policies\u0026revision=2018-11-21", + "http://openconfig.net/yang/policy-forwarding?module=openconfig-pf-interfaces\u0026revision=2018-11-21", + "http://openconfig.net/yang/policy-forwarding?module=openconfig-pf-path-groups\u0026revision=2018-11-21", + "http://openconfig.net/yang/policy-forwarding?module=openconfig-policy-forwarding\u0026revision=2018-11-21", + "http://openconfig.net/yang/policy-types?module=openconfig-policy-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/qos-types?module=openconfig-qos-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/qos?module=openconfig-qos\u0026revision=2019-11-28", + "http://openconfig.net/yang/qos?module=openconfig-qos-elements\u0026revision=2019-11-28", + "http://openconfig.net/yang/qos?module=openconfig-qos-interfaces\u0026revision=2019-11-28", + "http://openconfig.net/yang/relay-agent?module=openconfig-relay-agent\u0026revision=2018-11-21", + "http://openconfig.net/yang/rib/bgp-types?module=openconfig-rib-bgp-types\u0026revision=2019-03-14", + "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp\u0026revision=2019-10-15", + "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp-attributes\u0026revision=2019-10-15", + "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp-shared-attributes\u0026revision=2019-10-15", + "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp-table-attributes\u0026revision=2019-04-25", + "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp-tables\u0026revision=2019-10-15", + "http://openconfig.net/yang/routing-policy?module=openconfig-routing-policy\u0026revision=2018-11-21", + "http://openconfig.net/yang/rsvp?module=openconfig-mpls-rsvp\u0026revision=2020-02-04", + "http://openconfig.net/yang/segment-routing-types?module=openconfig-segment-routing-types\u0026revision=2020-02-04", + "http://openconfig.net/yang/segment-routing/srte-policy?module=openconfig-srte-policy\u0026revision=2020-05-01", + "http://openconfig.net/yang/sr?module=openconfig-segment-routing\u0026revision=2020-03-31", + "http://openconfig.net/yang/system/logging?module=openconfig-system-logging\u0026revision=2018-11-21", + "http://openconfig.net/yang/system/management?module=openconfig-system-management\u0026revision=2020-01-14", + "http://openconfig.net/yang/system/procmon?module=openconfig-procmon\u0026revision=2019-03-15", + "http://openconfig.net/yang/system/terminal?module=openconfig-system-terminal\u0026revision=2018-11-21", + "http://openconfig.net/yang/system?module=openconfig-system\u0026revision=2020-03-25", + "http://openconfig.net/yang/transport-types?module=openconfig-transport-types\u0026revision=2020-04-24", + "http://openconfig.net/yang/types/inet?module=openconfig-inet-types\u0026revision=2019-04-25", + "http://openconfig.net/yang/types/yang?module=openconfig-yang-types\u0026revision=2018-11-21", + "http://openconfig.net/yang/vlan-types?module=openconfig-vlan-types\u0026revision=2019-01-31", + "http://openconfig.net/yang/vlan?module=openconfig-vlan\u0026revision=2019-04-16", + "urn:aristanetworks:yang:experimental:eos?module=arista-exp-eos-mlag\u0026revision=2017-11-29", + "urn:ietf:params:netconf:base:1.0", + "urn:ietf:params:netconf:base:1.1", + "urn:ietf:params:netconf:capability:candidate:1.0", + "urn:ietf:params:netconf:capability:writable-running:1.0", + "urn:ietf:params:xml:ns:netconf:base:1.0", + "urn:ietf:params:xml:ns:netconf:base:1.0?module=ietf-netconf\u0026revision=2011-06-01", + "urn:ietf:params:xml:ns:yang:iana-if-type?module=iana-if-type\u0026revision=2017-01-19", + "urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types\u0026revision=2013-07-15", + "urn:ietf:params:xml:ns:yang:ietf-interfaces?module=ietf-interfaces\u0026revision=2018-02-20", + "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring", + "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring\u0026revision=2010-10-04", + "urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types\u0026revision=2013-07-15" + ] + }, + "datastores": { + "datastore": [ + { + "name": "running" + } + ] + }, + "schemas": { + "schema": [ + { + "format": "yang", + "identifier": "openconfig-pf-forwarding-policies", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/policy-forwarding", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-cli", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/cli", + "version": "2020-02-11" + }, + { + "format": "yang", + "identifier": "openconfig-if-tunnel", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/interfaces/tunnel", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-ospfv2", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ospfv2", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "openconfig-network-instance-l3", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/network-instance-l3", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-bgp-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/bgp/notsupported-deviations", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "openconfig-hercules-platform", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/hercules/platform", + "version": "2018-06-01" + }, + { + "format": "yang", + "identifier": "arista-bfd-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/bfd/notsupported-deviations", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "openconfig-extensions", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/openconfig-ext", + "version": "2018-10-17" + }, + { + "format": "yang", + "identifier": "openconfig-relay-agent", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/relay-agent", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-mpls-te", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/mpls", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-ospfv2-common", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ospfv2", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "openconfig-mpls-rsvp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/rsvp", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "openconfig-rib-bgp-shared-attributes", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/rib/bgp", + "version": "2019-10-15" + }, + { + "format": "yang", + "identifier": "openconfig-transport-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/transport-types", + "version": "2020-04-24" + }, + { + "format": "yang", + "identifier": "openconfig-isis-lsdb-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/isis-lsdb-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-openflow-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/openflow/types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-qos-acl-config", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/qos/acl", + "version": "2019-11-12" + }, + { + "format": "yang", + "identifier": "openconfig-if-poe", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/poe", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-messages", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/messages", + "version": "2018-08-13" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-global", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp", + "version": "2019-07-10" + }, + { + "format": "yang", + "identifier": "openconfig-hercules-platform-chassis", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/hercules/platform", + "version": "2018-06-01" + }, + { + "format": "yang", + "identifier": "arista-bfd-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/bfd/augments", + "version": "2020-01-06" + }, + { + "format": "yang", + "identifier": "ietf-netconf", + "location": [ + "NETCONF" + ], + "namespace": "urn:ietf:params:xml:ns:netconf:base:1.0", + "version": "2011-06-01" + }, + { + "format": "yang", + "identifier": "openconfig-mpls-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/mpls-types", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "arista-local-routing-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/local-routing/notsupported-deviations", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "arista-bgp-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/bgp/deviations", + "version": "2020-05-27" + }, + { + "format": "yang", + "identifier": "arista-lacp-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/lacp/deviations", + "version": "2017-09-07" + }, + { + "format": "yang", + "identifier": "openconfig-ospfv2-area-interface", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ospfv2", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "arista-system-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/system/notsupported-deviations", + "version": "2020-03-26" + }, + { + "format": "yang", + "identifier": "openconfig-routing-policy", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/routing-policy", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-srte-policy", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/segment-routing/srte-policy", + "version": "2020-05-01" + }, + { + "format": "yang", + "identifier": "arista-acl-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/acl/deviations", + "version": "2020-01-07" + }, + { + "format": "yang", + "identifier": "openconfig-network-instance", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/network-instance", + "version": "2020-06-20" + }, + { + "format": "yang", + "identifier": "arista-isis-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/isis/augments", + "version": "2020-03-18" + }, + { + "format": "yang", + "identifier": "openconfig-mpls-static", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/mpls", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-system-terminal", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/system/terminal", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-bgp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp", + "version": "2019-07-10" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-multicast", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/multicast", + "version": "2017-10-20" + }, + { + "format": "yang", + "identifier": "openconfig-lacp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/lacp", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-interfaces", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/interfaces", + "version": "2019-11-19" + }, + { + "format": "yang", + "identifier": "ietf-interfaces", + "location": [ + "NETCONF" + ], + "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces", + "version": "2018-02-20" + }, + { + "format": "yang", + "identifier": "openconfig-policy-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/policy-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-alarms", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/alarms", + "version": "2019-07-09" + }, + { + "format": "yang", + "identifier": "openconfig-rib-bgp-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/rib/bgp-types", + "version": "2019-03-14" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-varp-net-inst", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/varp/net-inst", + "version": "2019-05-22" + }, + { + "format": "yang", + "identifier": "openconfig-aaa-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aaa/types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-alarm-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/alarms/types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-routing-policy-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/routing-policy/notsupported-deviations", + "version": "2020-02-07" + }, + { + "format": "yang", + "identifier": "openconfig-platform-linecard", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/platform/linecard", + "version": "2020-05-10" + }, + { + "format": "yang", + "identifier": "arista-gnoi-cert", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/cert/gnoi-cert", + "version": "2018-01-15" + }, + { + "format": "yang", + "identifier": "openconfig-lldp-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/lldp/types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-bfd-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/bfd/deviations", + "version": "2018-08-08" + }, + { + "format": "yang", + "identifier": "openconfig-aaa-tacacs", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aaa", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-neighbor", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp", + "version": "2019-07-10" + }, + { + "format": "yang", + "identifier": "openconfig-aft-ethernet", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aft", + "version": "2019-11-07" + }, + { + "format": "yang", + "identifier": "arista-network-instance-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/network-instance/notsupported-deviations", + "version": "2020-07-31" + }, + { + "format": "yang", + "identifier": "arista-system-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/system/augments", + "version": "2020-03-09" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-qos", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/qos", + "version": "2017-09-26" + }, + { + "format": "yang", + "identifier": "openconfig-segment-routing", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/sr", + "version": "2020-03-31" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-mlag", + "location": [ + "NETCONF" + ], + "namespace": "urn:aristanetworks:yang:experimental:eos", + "version": "2017-11-29" + }, + { + "format": "yang", + "identifier": "ietf-inet-types", + "location": [ + "NETCONF" + ], + "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types", + "version": "2013-07-15" + }, + { + "format": "yang", + "identifier": "openconfig-system-logging", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/system/logging", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-rpol-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/policy/augments", + "version": "2018-04-12" + }, + { + "format": "yang", + "identifier": "openconfig-ospfv2-lsdb", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ospfv2", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "openconfig-pf-path-groups", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/policy-forwarding", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-peer-group", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp", + "version": "2019-07-10" + }, + { + "format": "yang", + "identifier": "ietf-yang-types", + "location": [ + "NETCONF" + ], + "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types", + "version": "2013-07-15" + }, + { + "format": "yang", + "identifier": "openconfig-license", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/license", + "version": "2020-04-22" + }, + { + "format": "yang", + "identifier": "arista-aft-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/aft/augments", + "version": "2019-10-01" + }, + { + "format": "yang", + "identifier": "openconfig-yang-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/types/yang", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-acl-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/acl/notsupported-deviations", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-common-multiprotocol", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp", + "version": "2019-07-10" + }, + { + "format": "yang", + "identifier": "arista-vlan-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/network-instance/deviations", + "version": "2019-11-13" + }, + { + "format": "yang", + "identifier": "openconfig-aft", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aft", + "version": "2019-11-07" + }, + { + "format": "yang", + "identifier": "arista-lldp-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/lldp/notsupported-deviations", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "openconfig-aft-common", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aft", + "version": "2019-11-07" + }, + { + "format": "yang", + "identifier": "arista-eos-types", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/eos-types", + "version": "2016-10-14" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-varp-intf", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/varp/intf", + "version": "2020-01-06" + }, + { + "format": "yang", + "identifier": "arista-intf-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/interfaces/deviations", + "version": "2020-04-02" + }, + { + "format": "yang", + "identifier": "openconfig-aft-mpls", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aft", + "version": "2019-11-07" + }, + { + "format": "yang", + "identifier": "openconfig-mpls-igp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/mpls", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-errors", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-lacp-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/lacp/notsupported-deviations", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "openconfig-hercules-interfaces", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/hercules/interfaces", + "version": "2018-06-01" + }, + { + "format": "yang", + "identifier": "openconfig-mpls-ldp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ldp", + "version": "2019-07-09" + }, + { + "format": "yang", + "identifier": "arista-pim-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/pim/augments", + "version": "2019-04-24" + }, + { + "format": "yang", + "identifier": "arista-mpls-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/mpls/augments", + "version": "2017-12-21" + }, + { + "format": "yang", + "identifier": "openconfig-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/openconfig-types", + "version": "2019-04-16" + }, + { + "format": "yang", + "identifier": "openconfig-network-instance-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/network-instance-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-platform-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/platform/notsupported-deviations", + "version": "2020-07-13" + }, + { + "format": "yang", + "identifier": "openconfig-procmon", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/system/procmon", + "version": "2019-03-15" + }, + { + "format": "yang", + "identifier": "openconfig-pf-srte", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/policy-forwarding/sr-te", + "version": "2019-10-15" + }, + { + "format": "yang", + "identifier": "openconfig-packet-match", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/header-fields", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-relay-agent-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/relay-agent/deviations", + "version": "2016-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-acl", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/acl", + "version": "2019-11-27" + }, + { + "format": "yang", + "identifier": "openconfig-policy-forwarding", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/policy-forwarding", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-ospfv2-global", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ospfv2", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "openconfig-rib-bgp-table-attributes", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/rib/bgp", + "version": "2019-04-25" + }, + { + "format": "yang", + "identifier": "openconfig-aft-pf", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aft", + "version": "2019-11-07" + }, + { + "format": "yang", + "identifier": "iana-if-type", + "location": [ + "NETCONF" + ], + "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type", + "version": "2017-01-19" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-l2protocolforwarding", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/l2protocolforwarding", + "version": "2020-04-16" + }, + { + "format": "yang", + "identifier": "openconfig-lldp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/lldp", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-system-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/system/deviations", + "version": "2020-01-21" + }, + { + "format": "yang", + "identifier": "openconfig-aft-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/fib-types", + "version": "2019-11-07" + }, + { + "format": "yang", + "identifier": "openconfig-hercules-platform-linecard", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/hercules/platform", + "version": "2018-06-01" + }, + { + "format": "yang", + "identifier": "openconfig-vlan-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/vlan-types", + "version": "2019-01-31" + }, + { + "format": "yang", + "identifier": "openconfig-local-routing", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/local-routing", + "version": "2020-03-24" + }, + { + "format": "yang", + "identifier": "arista-openflow-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/openflow/deviations", + "version": "2020-02-26" + }, + { + "format": "yang", + "identifier": "arista-vlan-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/network-instance/vlan/augments", + "version": "2020-01-06" + }, + { + "format": "yang", + "identifier": "openconfig-aaa-radius", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aaa", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-rib-bgp-attributes", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/rib/bgp", + "version": "2019-10-15" + }, + { + "format": "yang", + "identifier": "openconfig-packet-match-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/packet-match-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-lldp-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/lldp/augments", + "version": "2018-03-06" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-evpn", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/evpn", + "version": "2020-07-31" + }, + { + "format": "yang", + "identifier": "openconfig-hercules-qos", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/hercules/qos", + "version": "2018-06-01" + }, + { + "format": "yang", + "identifier": "arista-local-routing-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/local-routing/deviations", + "version": "2017-11-22" + }, + { + "format": "yang", + "identifier": "openconfig-platform-port", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/platform/port", + "version": "2020-05-06" + }, + { + "format": "yang", + "identifier": "openconfig-if-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/openconfig-if-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-interfaces-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/interfaces/notsupported-deviations", + "version": "2020-03-27" + }, + { + "format": "yang", + "identifier": "openconfig-ospfv2-area", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ospfv2", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "openconfig-aft-ipv4", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aft", + "version": "2019-11-07" + }, + { + "format": "yang", + "identifier": "openconfig-if-ip", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/interfaces/ip", + "version": "2019-01-08" + }, + { + "format": "yang", + "identifier": "openconfig-igmp-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/igmp/types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-isis", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/openconfig-isis", + "version": "2020-03-24" + }, + { + "format": "yang", + "identifier": "vlan-translation", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/vlan-translation", + "version": "2019-07-31" + }, + { + "format": "yang", + "identifier": "openconfig-qos-interfaces", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/qos", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "openconfig-rib-bgp-tables", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/rib/bgp", + "version": "2019-10-15" + }, + { + "format": "yang", + "identifier": "openconfig-platform-psu", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/platform/psu", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-qos-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/qos/augments", + "version": "2020-06-05" + }, + { + "format": "yang", + "identifier": "openconfig-isis-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/isis-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-bgp-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/bgp/augments", + "version": "2020-05-27" + }, + { + "format": "yang", + "identifier": "openconfig-qos-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/qos-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-segment-routing-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/segment-routing-types", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "openconfig-aft-ipv6", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aft", + "version": "2019-11-07" + }, + { + "format": "yang", + "identifier": "openconfig-platform", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/platform", + "version": "2019-04-16" + }, + { + "format": "yang", + "identifier": "openconfig-pim", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/pim", + "version": "2019-07-09" + }, + { + "format": "yang", + "identifier": "arista-lldp-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/lldp/deviations", + "version": "2018-04-02" + }, + { + "format": "yang", + "identifier": "openconfig-mpls-sr", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/mpls-sr", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-ospf-policy", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ospf-policy", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-mpls", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/mpls", + "version": "2019-03-26" + }, + { + "format": "yang", + "identifier": "openconfig-hercules-platform-node", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/hercules/platform", + "version": "2018-06-01" + }, + { + "format": "yang", + "identifier": "arista-messages-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/messages/notsupported-deviations", + "version": "2020-02-04" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-policy", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp-policy", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "arista-srte-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/policy-forwarding/augments", + "version": "2020-03-03" + }, + { + "format": "yang", + "identifier": "openconfig-bfd", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bfd", + "version": "2020-05-08" + }, + { + "format": "yang", + "identifier": "openconfig-qos-elements", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/qos", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-common-structure", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp", + "version": "2019-07-10" + }, + { + "format": "yang", + "identifier": "openconfig-ospf-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/ospf-types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "arista-rpol-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/policy/deviations", + "version": "2016-02-01" + }, + { + "format": "yang", + "identifier": "openconfig-platform-transceiver", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/platform/transceiver", + "version": "2020-05-06" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-vxlan-config", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/vxlan/config", + "version": "2018-08-01" + }, + { + "format": "yang", + "identifier": "arista-qos-notsupported-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/qos/notsupported-deviations", + "version": "2020-06-10" + }, + { + "format": "yang", + "identifier": "openconfig-aaa", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/aaa", + "version": "2019-10-28" + }, + { + "format": "yang", + "identifier": "openconfig-isis-routing", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/openconfig-isis", + "version": "2020-03-24" + }, + { + "format": "yang", + "identifier": "openconfig-pf-interfaces", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/policy-forwarding", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-common", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp", + "version": "2019-07-10" + }, + { + "format": "yang", + "identifier": "openconfig-bgp-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/bgp-types", + "version": "2020-06-17" + }, + { + "format": "yang", + "identifier": "arista-lacp-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/lacp/augments", + "version": "2017-09-14" + }, + { + "format": "yang", + "identifier": "openconfig-system-management", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/system/management", + "version": "2020-01-14" + }, + { + "format": "yang", + "identifier": "arista-mpls-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/mpls/deviations", + "version": "2018-03-19" + }, + { + "format": "yang", + "identifier": "openconfig-qos", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/qos", + "version": "2019-11-28" + }, + { + "format": "yang", + "identifier": "openconfig-platform-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/platform-types", + "version": "2019-06-03" + }, + { + "format": "yang", + "identifier": "arista-netinst-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/network-instances/deviations", + "version": "2019-05-24" + }, + { + "format": "yang", + "identifier": "openconfig-if-ethernet", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/interfaces/ethernet", + "version": "2020-05-06" + }, + { + "format": "yang", + "identifier": "openconfig-rib-bgp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/rib/bgp", + "version": "2019-10-15" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-vxlan", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/vxlan", + "version": "2018-08-01" + }, + { + "format": "yang", + "identifier": "arista-isis-deviations", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/isis/deviations", + "version": "2019-05-14" + }, + { + "format": "yang", + "identifier": "openconfig-platform-fan", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/platform/fan", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-platform-cpu", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/platform/cpu", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "ietf-netconf-monitoring", + "location": [ + "NETCONF" + ], + "namespace": "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring", + "version": "2010-10-04" + }, + { + "format": "yang", + "identifier": "openconfig-hercules-platform-port", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/hercules/platform", + "version": "2018-06-01" + }, + { + "format": "yang", + "identifier": "openconfig-if-aggregate", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/interfaces/aggregate", + "version": "2020-05-01" + }, + { + "format": "yang", + "identifier": "arista-srte-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/policy-forwarding/augments", + "version": "2020-01-28" + }, + { + "format": "yang", + "identifier": "arista-exp-eos", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos", + "version": "2016-11-09" + }, + { + "format": "yang", + "identifier": "openconfig-igmp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/igmp", + "version": "2019-07-09" + }, + { + "format": "yang", + "identifier": "openconfig-inet-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/types/inet", + "version": "2019-04-25" + }, + { + "format": "yang", + "identifier": "openconfig-isis-lsp", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/openconfig-isis", + "version": "2020-03-24" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-qos-config", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/eos/qos/config", + "version": "2017-09-26" + }, + { + "format": "yang", + "identifier": "openconfig-system", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/system", + "version": "2020-03-25" + }, + { + "format": "yang", + "identifier": "openconfig-openflow", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/openflow", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-pim-types", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/pim/types", + "version": "2018-11-21" + }, + { + "format": "yang", + "identifier": "openconfig-network-instance-l2", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/network-instance", + "version": "2020-06-20" + }, + { + "format": "yang", + "identifier": "arista-rpc-netconf", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/rpc/netconf", + "version": "2018-01-04" + }, + { + "format": "yang", + "identifier": "arista-intf-augments", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/openconfig/interfaces/augments", + "version": "2020-05-13" + }, + { + "format": "yang", + "identifier": "openconfig-vlan", + "location": [ + "NETCONF" + ], + "namespace": "http://openconfig.net/yang/vlan", + "version": "2019-04-16" + }, + { + "format": "yang", + "identifier": "arista-exp-eos-igmpsnooping", + "location": [ + "NETCONF" + ], + "namespace": "http://arista.com/yang/experimental/igmpsnooping", + "version": "2017-10-23" + } + ] + }, + "sessions": { + "session": [] + }, + "statistics": { + "dropped-sessions": 0, + "in-bad-hellos": 0, + "in-bad-rpcs": 0, + "in-rpcs": 0, + "in-sessions": 0, + "out-notifications": 0, + "out-rpc-errors": 0 + } + }, + "openconfig-acl:acl": { + "state": { + "counter-capability": "AGGREGATE_ONLY" + } + }, + "openconfig-bfd:bfd": { + "arista-bfd-augments:config": { + "desired-minimum-tx-interval": 300, + "detection-multiplier": 3, + "enabled": true, + "local-address": [], + "multihop-desired-minimum-tx-interval": 300, + "multihop-detection-multiplier": 3, + "multihop-required-minimum-receive": 300, + "required-minimum-receive": 300, + "slow-timer": 2000 + } + }, + "openconfig-interfaces:interfaces": { + "interface": [ + { + "config": { + "arista-intf-augments:load-interval": 300, + "description": "", + "enabled": true, + "loopback-mode": false, + "mtu": 0, + "name": "Ethernet510", + "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100", + "type": "iana-if-type:ethernetCsmacd" + }, + "hold-time": { + "config": { + "down": 0, + "up": 0 + }, + "state": { + "down": 0, + "up": 0 + } + }, + "name": "Ethernet510", + "openconfig-if-ethernet:ethernet": { + "arista-intf-augments:pfc": { + "priorities": { + "priority": [ + { + "index": 0, + "state": { + "in-frames": "0", + "index": 0, + "out-frames": "0" + } + }, + { + "index": 1, + "state": { + "in-frames": "0", + "index": 1, + "out-frames": "0" + } + }, + { + "index": 2, + "state": { + "in-frames": "0", + "index": 2, + "out-frames": "0" + } + }, + { + "index": 3, + "state": { + "in-frames": "0", + "index": 3, + "out-frames": "0" + } + }, + { + "index": 4, + "state": { + "in-frames": "0", + "index": 4, + "out-frames": "0" + } + }, + { + "index": 5, + "state": { + "in-frames": "0", + "index": 5, + "out-frames": "0" + } + }, + { + "index": 6, + "state": { + "in-frames": "0", + "index": 6, + "out-frames": "0" + } + }, + { + "index": 7, + "state": { + "in-frames": "0", + "index": 7, + "out-frames": "0" + } + } + ] + } + }, + "config": { + "arista-intf-augments:fec-encoding": { + "disabled": false, + "fire-code": false, + "reed-solomon": false, + "reed-solomon544": false + }, + "arista-intf-augments:sfp-1000base-t": false, + "mac-address": "00:00:00:00:00:00", + "openconfig-hercules-interfaces:forwarding-viable": true, + "port-speed": "SPEED_UNKNOWN" + }, + "state": { + "arista-intf-augments:supported-speeds": [ + "SPEED_200GB_8LANE", + "SPEED_100MB", + "SPEED_1GB", + "SPEED_10GB", + "SPEED_400GB", + "SPEED_40GB", + "SPEED_2500MB", + "SPEED_50GB", + "SPEED_50GB_1LANE", + "SPEED_25GB", + "SPEED_100GB", + "SPEED_100GB_2LANE", + "SPEED_10MB", + "SPEED_200GB_4LANE", + "SPEED_5GB" + ], + "auto-negotiate": false, + "counters": { + "in-crc-errors": "0", + "in-fragment-frames": "0", + "in-jabber-frames": "0", + "in-mac-control-frames": "0", + "in-mac-pause-frames": "0", + "in-oversize-frames": "0", + "out-mac-control-frames": "0", + "out-mac-pause-frames": "0" + }, + "duplex-mode": "FULL", + "enable-flow-control": false, + "hw-mac-address": "02:42:c0:a8:02:42", + "mac-address": "02:42:c0:a8:02:42", + "negotiated-port-speed": "SPEED_UNKNOWN", + "openconfig-hercules-interfaces:forwarding-viable": true, + "port-speed": "SPEED_UNKNOWN" + } + }, + "state": { + "admin-status": "UP", + "arista-intf-augments:inactive": false, + "counters": { + "in-broadcast-pkts": "344691", + "in-discards": "0", + "in-errors": "0", + "in-fcs-errors": "0", + "in-multicast-pkts": "1", + "in-octets": "93260151", + "in-unicast-pkts": "0", + "out-broadcast-pkts": "0", + "out-discards": "0", + "out-errors": "0", + "out-multicast-pkts": "0", + "out-octets": "0", + "out-unicast-pkts": "0" + }, + "description": "", + "enabled": true, + "ifindex": 510, + "last-change": "1614091948142304000", + "loopback-mode": false, + "mtu": 0, + "name": "Ethernet510", + "openconfig-platform-port:hardware-port": "Port510", + "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100", + "oper-status": "UP", + "type": "iana-if-type:ethernetCsmacd" + }, + "subinterfaces": { + "subinterface": [ + { + "config": { + "description": "", + "enabled": true, + "index": 0 + }, + "index": 0, + "openconfig-if-ip:ipv4": { + "config": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "state": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "unnumbered": { + "config": { + "enabled": false + }, + "state": { + "enabled": false + } + } + }, + "openconfig-if-ip:ipv6": { + "config": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + }, + "state": { + "dhcp-client": false, + "enabled": false, + "mtu": 1500 + } + }, + "state": { + "counters": { + "in-fcs-errors": "0" + }, + "description": "", + "enabled": true, + "index": 0 + } + } + ] + } + } + ] + }, + "openconfig-lacp:lacp": { + "config": { + "system-priority": 32768 + }, + "state": { + "system-priority": 32768 + } + }, + "openconfig-lldp:lldp": { + "config": { + "arista-lldp-augments:management-address": { + "interface": "", + "network-instance": "default", + "transmit-mode": "BEST" + }, + "chassis-id": "02:42:c0:6c:64:78", + "chassis-id-type": "MAC_ADDRESS", + "enabled": true, + "hello-timer": "30", + "suppress-tlv-advertisement": [], + "system-description": "", + "system-name": "localhost" + }, + "interfaces": { + "interface": [ + { + "config": { + "enabled": true, + "name": "Ethernet510" + }, + "name": "Ethernet510", + "state": { + "counters": { + "frame-discard": "0", + "frame-error-in": "0", + "frame-in": "0", + "frame-out": "26299", + "tlv-discard": "0", + "tlv-unknown": "0" + }, + "enabled": true, + "name": "Ethernet510" + } + } + ] + }, + "state": { + "chassis-id": "02:42:c0:6c:64:78", + "chassis-id-type": "MAC_ADDRESS", + "enabled": true, + "hello-timer": "30", + "suppress-tlv-advertisement": [], + "system-description": "", + "system-name": "localhost" + } + }, + "openconfig-network-instance:network-instances": { + "network-instance": [ + { + "arista-exp-eos-varp-net-inst:arista-varp": { + "config": { + "virtual-mac-address": "00:00:00:00:00:00" + }, + "state": { + "virtual-mac-address": "00:00:00:00:00:00" + } + }, + "config": { + "enabled-address-families": [], + "name": "default", + "type": "openconfig-network-instance-types:DEFAULT_INSTANCE" + }, + "inter-instance-policies": { + "apply-policy": { + "config": { + "default-import-policy": "REJECT_ROUTE" + } + } + }, + "mpls": { + "global": { + "config": { + "null-label": "openconfig-mpls-types:IMPLICIT" + }, + "reserved-label-blocks": { + "reserved-label-block": [ + { + "config": { + "local-id": "isis-sr", + "lower-bound": 900000, + "upper-bound": 965535 + }, + "local-id": "isis-sr" + }, + { + "config": { + "local-id": "bgp-sr", + "lower-bound": 900000, + "upper-bound": 965535 + }, + "local-id": "bgp-sr" + }, + { + "config": { + "local-id": "srlb", + "lower-bound": 965536, + "upper-bound": 1031071 + }, + "local-id": "srlb" + }, + { + "config": { + "local-id": "l2evpn", + "lower-bound": 1036288, + "upper-bound": 1048575 + }, + "local-id": "l2evpn" + }, + { + "config": { + "local-id": "dynamic", + "lower-bound": 100000, + "upper-bound": 362143 + }, + "local-id": "dynamic" + }, + { + "config": { + "local-id": "static", + "lower-bound": 16, + "upper-bound": 99999 + }, + "local-id": "static" + } + ] + } + } + }, + "name": "default", + "protocols": { + "protocol": [ + { + "config": { + "identifier": "openconfig-policy-types:DIRECTLY_CONNECTED", + "name": "DIRECTLY_CONNECTED" + }, + "identifier": "openconfig-policy-types:DIRECTLY_CONNECTED", + "name": "DIRECTLY_CONNECTED" + }, + { + "config": { + "identifier": "openconfig-policy-types:STATIC", + "name": "STATIC" + }, + "identifier": "openconfig-policy-types:STATIC", + "name": "STATIC", + "static-routes": { + "static": [ + { + "config": { + "prefix": "::/0" + }, + "next-hops": { + "next-hop": [ + { + "config": { + "index": "AUTO_1_fdfd--1", + "metric": 1, + "next-hop": "fdfd::1" + }, + "index": "AUTO_1_fdfd--1" + } + ] + }, + "prefix": "::/0" + }, + { + "config": { + "prefix": "0.0.0.0/0" + }, + "next-hops": { + "next-hop": [ + { + "config": { + "index": "AUTO_1_192-168-2-1", + "metric": 1, + "next-hop": "192.168.2.1" + }, + "index": "AUTO_1_192-168-2-1" + } + ] + }, + "prefix": "0.0.0.0/0" + } + ] + } + }, + { + "bgp": { + "global": { + "afi-safis": { + "afi-safi": [ + { + "afi-safi-name": "openconfig-bgp-types:IPV6_UNICAST", + "config": { + "afi-safi-name": "openconfig-bgp-types:IPV6_UNICAST" + }, + "state": { + "afi-safi-name": "openconfig-bgp-types:IPV6_UNICAST" + } + }, + { + "afi-safi-name": "openconfig-bgp-types:IPV4_UNICAST", + "config": { + "afi-safi-name": "openconfig-bgp-types:IPV4_UNICAST" + }, + "state": { + "afi-safi-name": "openconfig-bgp-types:IPV4_UNICAST" + } + } + ] + }, + "use-multiple-paths": { + "config": { + "enabled": true + }, + "state": { + "enabled": true + } + } + } + }, + "config": { + "identifier": "openconfig-policy-types:BGP", + "name": "BGP" + }, + "identifier": "openconfig-policy-types:BGP", + "name": "BGP" + }, + { + "config": { + "identifier": "openconfig-policy-types:PIM", + "name": "PIM" + }, + "identifier": "openconfig-policy-types:PIM", + "name": "PIM", + "state": { + "identifier": "openconfig-policy-types:PIM", + "name": "PIM" + } + } + ] + }, + "segment-routing": { + "srgbs": { + "srgb": [ + { + "config": { + "dataplane-type": "MPLS", + "local-id": "isis-sr", + "mpls-label-blocks": [ + "isis-sr" + ] + }, + "local-id": "isis-sr" + } + ] + }, + "srlbs": { + "srlb": [ + { + "config": { + "dataplane-type": "MPLS", + "local-id": "srlb", + "mpls-label-block": "srlb" + }, + "local-id": "srlb" + } + ] + } + }, + "tables": { + "table": [ + { + "address-family": "openconfig-types:IPV4", + "config": { + "address-family": "openconfig-types:IPV4", + "protocol": "openconfig-policy-types:DIRECTLY_CONNECTED" + }, + "protocol": "openconfig-policy-types:DIRECTLY_CONNECTED" + }, + { + "address-family": "openconfig-types:IPV6", + "config": { + "address-family": "openconfig-types:IPV6", + "protocol": "openconfig-policy-types:DIRECTLY_CONNECTED" + }, + "protocol": "openconfig-policy-types:DIRECTLY_CONNECTED" + }, + { + "address-family": "openconfig-types:IPV4", + "config": { + "address-family": "openconfig-types:IPV4", + "protocol": "openconfig-policy-types:STATIC" + }, + "protocol": "openconfig-policy-types:STATIC" + }, + { + "address-family": "openconfig-types:IPV6", + "config": { + "address-family": "openconfig-types:IPV6", + "protocol": "openconfig-policy-types:STATIC" + }, + "protocol": "openconfig-policy-types:STATIC" + } + ] + }, + "vlans": { + "vlan": [ + { + "config": { + "arista-vlan-augments:mac-learning": true, + "name": "default", + "status": "ACTIVE", + "vlan-id": 1 + }, + "members": { + "member": [ + { + "state": { + "interface": "Ethernet510" + } + } + ] + }, + "state": { + "arista-vlan-augments:mac-learning": true, + "name": "default", + "status": "ACTIVE", + "vlan-id": 1 + }, + "vlan-id": 1 + } + ] + } + } + ] + }, + "openconfig-platform:components": { + "component": [ + { + "config": { + "name": "CPU1" + }, + "cpu": { + "openconfig-platform-cpu:utilization": { + "state": { + "avg": 0, + "instant": 0, + "interval": "1000000000000", + "max": 11, + "max-time": "3220922909253935104", + "min": 0, + "min-time": "3220922969253274112" + } + } + }, + "name": "CPU1", + "state": { + "type": "openconfig-platform-types:CPU" + } + }, + { + "config": { + "name": "CPU2" + }, + "cpu": { + "openconfig-platform-cpu:utilization": { + "state": { + "avg": 0, + "instant": 1, + "interval": "1000000000000", + "max": 3, + "max-time": "3220921819260574208", + "min": 0, + "min-time": "3220922939256949248" + } + } + }, + "name": "CPU2", + "state": { + "type": "openconfig-platform-types:CPU" + } + }, + { + "config": { + "name": "CPU3" + }, + "cpu": { + "openconfig-platform-cpu:utilization": { + "state": { + "avg": 0, + "instant": 0, + "interval": "1000000000000", + "max": 11, + "max-time": "3220922009258855936", + "min": 0, + "min-time": "3220922969253549568" + } + } + }, + "name": "CPU3", + "state": { + "type": "openconfig-platform-types:CPU" + } + }, + { + "config": { + "name": "CPU0" + }, + "cpu": { + "openconfig-platform-cpu:utilization": { + "state": { + "avg": 0, + "instant": 0, + "interval": "1000000000000", + "max": 3, + "max-time": "3220922909253848064", + "min": 0, + "min-time": "3220922969253206528" + } + } + }, + "name": "CPU0", + "state": { + "type": "openconfig-platform-types:CPU" + } + }, + { + "config": { + "name": "Chassis" + }, + "name": "Chassis", + "state": { + "memory": { + "available": "4127031296", + "utilized": "3911405568" + }, + "name": "Chassis", + "type": "openconfig-platform-types:CHASSIS" + } + }, + { + "config": { + "name": "Port510" + }, + "name": "Port510", + "state": { + "name": "Port510" + } + } + ] + }, + "openconfig-routing-policy:routing-policy": { + "defined-sets": { + "prefix-sets": { + "prefix-set": [] + } + }, + "policy-definitions": { + "policy-definition": [] + } + }, + "openconfig-system:system": { + "aaa": { + "arista-system-augments:global": { + "radius": { + "config": { + "retransmit-attempts": 3, + "timeout": 5 + }, + "state": { + "retransmit-attempts": 3, + "timeout": 5 + } + }, + "tacacs": { + "config": { + "timeout": 5 + }, + "state": { + "timeout": 5 + } + } + }, + "authentication": { + "config": { + "authentication-method": [ + "openconfig-aaa-types:LOCAL" + ] + }, + "state": { + "authentication-method": [ + "openconfig-aaa-types:LOCAL" + ] + }, + "users": { + "user": [ + { + "config": { + "password-hashed": "$6$TA00T9txFfm8ez7I$CPgZxMSvbkc3IODR3h.5dnel2K5N3dcuZ6qmwd8u8HDaMhViG9YSbHQaDeH7cQYV4zWz.5eOsjreQZac9LkgO/", + "role": "openconfig-aaa-types:SYSTEM_ROLE_ADMIN", + "username": "admin" + }, + "state": { + "password-hashed": "$6$TA00T9txFfm8ez7I$CPgZxMSvbkc3IODR3h.5dnel2K5N3dcuZ6qmwd8u8HDaMhViG9YSbHQaDeH7cQYV4zWz.5eOsjreQZac9LkgO/", + "role": "openconfig-aaa-types:SYSTEM_ROLE_ADMIN", + "username": "admin" + }, + "username": "admin" + } + ] + } + } + }, + "arista-system-augments:fhrp": { + "config": { + "accept-mode": "DISABLED" + } + }, + "config": {}, + "dns": { + "config": { + "arista-system-augments:network-instance": "default" + }, + "state": { + "arista-system-augments:network-instance": "default" + } + }, + "grpc-server": { + "config": { + "certificate-id": "", + "enable": true, + "port": 6030, + "transport-security": false + }, + "state": { + "certificate-id": "", + "enable": true, + "port": 6030, + "transport-security": false + } + }, + "memory": { + "state": { + "physical": "4127031296", + "reserved": "3911405568" + } + }, + "ntp": { + "config": { + "enable-ntp-auth": false, + "enabled": false + }, + "state": { + "enable-ntp-auth": false, + "enabled": false + } + }, + "openconfig-openflow:openflow": { + "agent": { + "config": { + "inactivity-probe": "10" + }, + "state": { + "inactivity-probe": "10" + } + } + }, + "processes": { + "process": [ + { + "pid": "966", + "state": { + "args": [ + "--agenttitle=McastCommon6 --dlopen procmgr /usr/bin/McastCommon6" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1650688", + "memory-utilization": 0, + "name": "netns", + "pid": "966", + "start-time": "1622215688635663872" + } + }, + { + "pid": "1001", + "state": { + "args": [ + "--agenttitle=SharedSecretProfile --dlopen procmgr /usr/bin/SharedSecretProfile" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1601536", + "memory-utilization": 0, + "name": "netns", + "pid": "1001", + "start-time": "1622215689635663872" + } + }, + { + "pid": "297", + "state": { + "args": [ + "-n" + ], + "cpu-usage-system": "761", + "cpu-usage-user": "114", + "cpu-utilization": 0, + "memory-usage": "2633728", + "memory-utilization": 0, + "name": "crond", + "pid": "297", + "start-time": "1622215617635663872" + } + }, + { + "pid": "960", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "151115", + "cpu-usage-user": "54927", + "cpu-utilization": 0, + "memory-usage": "69464064", + "memory-utilization": 1, + "name": "AgentMonitor", + "pid": "960", + "start-time": "1622215688635663872" + } + }, + { + "pid": "364", + "state": { + "args": [ + "--dedup --compress --priority Sysdb --maxFiles 1000 /var/tmp/Fossil /mnt/flash/Fossil" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "8", + "cpu-utilization": 0, + "memory-usage": "1802240", + "memory-utilization": 0, + "name": "SaveFossil", + "pid": "364", + "start-time": "1622215617635663872" + } + }, + { + "pid": "956", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "956", + "start-time": "1622215688635663872" + } + }, + { + "pid": "167", + "state": { + "args": [ + "-f" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "2166784", + "memory-utilization": 0, + "name": "lvmetad", + "pid": "167", + "start-time": "1622215614635663872" + } + }, + { + "pid": "972", + "state": { + "args": [ + "--agenttitle=Arp --dlopen procmgr /usr/bin/Arp" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1617920", + "memory-utilization": 0, + "name": "netns", + "pid": "972", + "start-time": "1622215688635663872" + } + }, + { + "pid": "933", + "state": { + "args": [ + "--agenttitle=PortSec --dlopen procmgr /usr/bin/PortSec" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1634304", + "memory-utilization": 0, + "name": "netns", + "pid": "933", + "start-time": "1622215688635663872" + } + }, + { + "pid": "924", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "20568", + "cpu-usage-user": "4995", + "cpu-utilization": 0, + "memory-usage": "107622400", + "memory-utilization": 2, + "name": "SuperServer", + "pid": "924", + "start-time": "1622215688635663872" + } + }, + { + "pid": "941", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "941", + "start-time": "1622215688635663872" + } + }, + { + "pid": "940", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "4552", + "cpu-usage-user": "11063", + "cpu-utilization": 0, + "memory-usage": "91471872", + "memory-utilization": 2, + "name": "Lag", + "pid": "940", + "start-time": "1622215688635663872" + } + }, + { + "pid": "938", + "state": { + "args": [ + "--agenttitle=StpTxRx --dlopen procmgr /usr/bin/StpTxRx" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1638400", + "memory-utilization": 0, + "name": "netns", + "pid": "938", + "start-time": "1622215688635663872" + } + }, + { + "pid": "224", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1346", + "cpu-usage-user": "264", + "cpu-utilization": 0, + "memory-usage": "1458176", + "memory-utilization": 0, + "name": "ProcMonitor", + "pid": "224", + "start-time": "1622215615635663872" + } + }, + { + "pid": "970", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "970", + "start-time": "1622215688635663872" + } + }, + { + "pid": "997", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "997", + "start-time": "1622215689635663872" + } + }, + { + "pid": "951", + "state": { + "args": [ + "--agenttitle=StpTopology --dlopen procmgr /usr/bin/StpTopology" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1638400", + "memory-utilization": 0, + "name": "netns", + "pid": "951", + "start-time": "1622215688635663872" + } + }, + { + "pid": "974", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1303", + "cpu-usage-user": "2836", + "cpu-utilization": 0, + "memory-usage": "82403328", + "memory-utilization": 1, + "name": "McastCommon6", + "pid": "974", + "start-time": "1622215688635663872" + } + }, + { + "pid": "929", + "state": { + "args": [ + "--agenttitle=Lag --dlopen procmgr /usr/bin/Lag" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1642496", + "memory-utilization": 0, + "name": "netns", + "pid": "929", + "start-time": "1622215688635663872" + } + }, + { + "pid": "1003", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1918", + "cpu-usage-user": "4022", + "cpu-utilization": 0, + "memory-usage": "99753984", + "memory-utilization": 2, + "name": "IgmpSnooping", + "pid": "1003", + "start-time": "1622215689635663872" + } + }, + { + "pid": "497", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "9497", + "cpu-usage-user": "2576", + "cpu-utilization": 0, + "memory-usage": "2473984", + "memory-utilization": 0, + "name": "SlabMonitor", + "pid": "497", + "start-time": "1622215644635663872" + } + }, + { + "pid": "1004", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "1004", + "start-time": "1622215689635663872" + } + }, + { + "pid": "968", + "state": { + "args": [ + "--agenttitle=LacpTxAgent --dlopen procmgr /usr/bin/LacpTxAgent" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1638400", + "memory-utilization": 0, + "name": "netns", + "pid": "968", + "start-time": "1622215688635663872" + } + }, + { + "pid": "936", + "state": { + "args": [ + "--agenttitle=EventMgr --dlopen procmgr /usr/bin/EventMgr" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1736704", + "memory-utilization": 0, + "name": "netns", + "pid": "936", + "start-time": "1622215688635663872" + } + }, + { + "pid": "946", + "state": { + "args": [ + "--agenttitle=FibServices --dlopen procmgr /usr/bin/FibServices" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1716224", + "memory-utilization": 0, + "name": "netns", + "pid": "946", + "start-time": "1622215688635663872" + } + }, + { + "pid": "935", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "935", + "start-time": "1622215688635663872" + } + }, + { + "pid": "977", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "977", + "start-time": "1622215688635663872" + } + }, + { + "pid": "597", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "24815", + "cpu-usage-user": "28918", + "cpu-utilization": 0, + "memory-usage": "153731072", + "memory-utilization": 3, + "name": "Sysdb", + "pid": "597", + "start-time": "1622215646635663872" + } + }, + { + "pid": "672", + "state": { + "args": [ + " /usr/bin/Cli" + ], + "cpu-usage-system": "1050", + "cpu-usage-user": "1606", + "cpu-utilization": 0, + "memory-usage": "13520896", + "memory-utilization": 0, + "name": "CliShell", + "pid": "672", + "start-time": "1622215648635663872" + } + }, + { + "pid": "949", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "949", + "start-time": "1622215688635663872" + } + }, + { + "pid": "980", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "6315", + "cpu-usage-user": "16098", + "cpu-utilization": 0, + "memory-usage": "76705792", + "memory-utilization": 1, + "name": "Stp", + "pid": "980", + "start-time": "1622215688635663872" + } + }, + { + "pid": "748", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "2838528", + "memory-utilization": 0, + "name": "bash", + "pid": "748", + "start-time": "1622215658635663872" + } + }, + { + "pid": "947", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1661", + "cpu-usage-user": "4080", + "cpu-utilization": 0, + "memory-usage": "100040704", + "memory-utilization": 2, + "name": "Ira", + "pid": "947", + "start-time": "1622215688635663872" + } + }, + { + "pid": "927", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "2095", + "cpu-usage-user": "4769", + "cpu-utilization": 0, + "memory-usage": "82345984", + "memory-utilization": 1, + "name": "Lldp", + "pid": "927", + "start-time": "1622215688635663872" + } + }, + { + "pid": "926", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "926", + "start-time": "1622215688635663872" + } + }, + { + "pid": "993", + "state": { + "args": [ + "--agenttitle=Ebra --dlopen procmgr /usr/bin/Ebra" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1564672", + "memory-utilization": 0, + "name": "netns", + "pid": "993", + "start-time": "1622215689635663872" + } + }, + { + "pid": "967", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "2258", + "cpu-usage-user": "2317", + "cpu-utilization": 0, + "memory-usage": "79106048", + "memory-utilization": 1, + "name": "Tunnel", + "pid": "967", + "start-time": "1622215688635663872" + } + }, + { + "pid": "983", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1468", + "cpu-usage-user": "3094", + "cpu-utilization": 0, + "memory-usage": "83124224", + "memory-utilization": 2, + "name": "LacpTxAgent", + "pid": "983", + "start-time": "1622215689635663872" + } + }, + { + "pid": "995", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "2180", + "cpu-usage-user": "3209", + "cpu-utilization": 0, + "memory-usage": "79425536", + "memory-utilization": 1, + "name": "Qos", + "pid": "995", + "start-time": "1622215689635663872" + } + }, + { + "pid": "954", + "state": { + "args": [ + "--agenttitle=Tunnel --dlopen procmgr /usr/bin/Tunnel" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1642496", + "memory-utilization": 0, + "name": "netns", + "pid": "954", + "start-time": "1622215688635663872" + } + }, + { + "pid": "391", + "state": { + "args": [ + "-m -r -e modify -e create -e delete -e attrib -e move ." + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1576960", + "memory-utilization": 0, + "name": "inotifywait", + "pid": "391", + "start-time": "1622215618635663872" + } + }, + { + "pid": "969", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "6349", + "cpu-usage-user": "17003", + "cpu-utilization": 0, + "memory-usage": "99954688", + "memory-utilization": 2, + "name": "Acl", + "pid": "969", + "start-time": "1622215688635663872" + } + }, + { + "pid": "964", + "state": { + "args": [ + "--agenttitle=KernelNetworkInfo --dlopen procmgr /usr/bin/KernelNetworkInfo" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1544192", + "memory-utilization": 0, + "name": "netns", + "pid": "964", + "start-time": "1622215688635663872" + } + }, + { + "pid": "998", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "2018", + "cpu-usage-user": "4711", + "cpu-utilization": 0, + "memory-usage": "92426240", + "memory-utilization": 2, + "name": "Ebra", + "pid": "998", + "start-time": "1622215689635663872" + } + }, + { + "pid": "962", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "962", + "start-time": "1622215688635663872" + } + }, + { + "pid": "958", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "958", + "start-time": "1622215688635663872" + } + }, + { + "pid": "1002", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1881", + "cpu-usage-user": "3990", + "cpu-utilization": 0, + "memory-usage": "91709440", + "memory-utilization": 2, + "name": "KernelFib", + "pid": "1002", + "start-time": "1622215689635663872" + } + }, + { + "pid": "950", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1604", + "cpu-usage-user": "2701", + "cpu-utilization": 0, + "memory-usage": "92332032", + "memory-utilization": 2, + "name": "Aaa", + "pid": "950", + "start-time": "1622215688635663872" + } + }, + { + "pid": "418", + "state": { + "args": [ + "/usr/sbin/core_annotate_util daemon" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "2588672", + "memory-utilization": 0, + "name": "core_annotate_u", + "pid": "418", + "start-time": "1622215625635663872" + } + }, + { + "pid": "963", + "state": { + "args": [ + "--agenttitle=Stp --dlopen procmgr /usr/bin/Stp" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1613824", + "memory-utilization": 0, + "name": "netns", + "pid": "963", + "start-time": "1622215688635663872" + } + }, + { + "pid": "434", + "state": { + "args": [ + "-e modify /var/lib/rpm" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "569344", + "memory-utilization": 0, + "name": "inotifywait", + "pid": "434", + "start-time": "1622215625635663872" + } + }, + { + "pid": "981", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "2124", + "cpu-usage-user": "4414", + "cpu-utilization": 0, + "memory-usage": "98656256", + "memory-utilization": 2, + "name": "Arp", + "pid": "981", + "start-time": "1622215688635663872" + } + }, + { + "pid": "939", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "939", + "start-time": "1622215688635663872" + } + }, + { + "pid": "942", + "state": { + "args": [ + "--agenttitle=AgentMonitor --dlopen procmgr /usr/bin/AgentMonitor" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1593344", + "memory-utilization": 0, + "name": "netns", + "pid": "942", + "start-time": "1622215688635663872" + } + }, + { + "pid": "975", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "975", + "start-time": "1622215688635663872" + } + }, + { + "pid": "979", + "state": { + "args": [ + "--agenttitle=ReloadCauseAgent --dlopen procmgr /usr/bin/ReloadCauseAgent" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1650688", + "memory-utilization": 0, + "name": "netns", + "pid": "979", + "start-time": "1622215688635663872" + } + }, + { + "pid": "477", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "57053184", + "memory-utilization": 1, + "name": "ProcMgr-master", + "pid": "477", + "start-time": "1622215644635663872" + } + }, + { + "pid": "984", + "state": { + "args": [ + "--agenttitle=Qos --dlopen procmgr /usr/bin/Qos" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1638400", + "memory-utilization": 0, + "name": "netns", + "pid": "984", + "start-time": "1622215689635663872" + } + }, + { + "pid": "948", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "14678", + "cpu-usage-user": "2950", + "cpu-utilization": 0, + "memory-usage": "84791296", + "memory-utilization": 2, + "name": "EventMgr", + "pid": "948", + "start-time": "1622215688635663872" + } + }, + { + "pid": "971", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "971", + "start-time": "1622215688635663872" + } + }, + { + "pid": "994", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "994", + "start-time": "1622215689635663872" + } + }, + { + "pid": "934", + "state": { + "args": [ + "--agenttitle=Ira --dlopen procmgr /usr/bin/Ira" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1642496", + "memory-utilization": 0, + "name": "netns", + "pid": "934", + "start-time": "1622215688635663872" + } + }, + { + "pid": "368", + "state": { + "args": [ + "-m -r -e modify -e create -e delete -e attrib -e move ." + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "610304", + "memory-utilization": 0, + "name": "inotifywait", + "pid": "368", + "start-time": "1622215618635663872" + } + }, + { + "pid": "1008", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "42879814", + "cpu-usage-user": "35050036", + "cpu-utilization": 0, + "memory-usage": "123768832", + "memory-utilization": 2, + "name": "Etba", + "pid": "1008", + "start-time": "1622215689635663872" + } + }, + { + "pid": "1005", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1781", + "cpu-usage-user": "1923", + "cpu-utilization": 0, + "memory-usage": "69140480", + "memory-utilization": 1, + "name": "SharedSecretPro", + "pid": "1005", + "start-time": "1622215689635663872" + } + }, + { + "pid": "982", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "982", + "start-time": "1622215689635663872" + } + }, + { + "pid": "264", + "state": { + "args": [ + "-stayalive -pidfile /var/run/xinetd.pid" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "2289664", + "memory-utilization": 0, + "name": "xinetd", + "pid": "264", + "start-time": "1622215615635663872" + } + }, + { + "pid": "216", + "state": { + "args": [ + "--ignorenodev --daemon --foreground" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1667072", + "memory-utilization": 0, + "name": "mcelog", + "pid": "216", + "start-time": "1622215615635663872" + } + }, + { + "pid": "921", + "state": { + "args": [ + "--agenttitle=McastCommon --dlopen procmgr /usr/bin/McastCommon" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1630208", + "memory-utilization": 0, + "name": "netns", + "pid": "921", + "start-time": "1622215688635663872" + } + }, + { + "pid": "991", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "991", + "start-time": "1622215689635663872" + } + }, + { + "pid": "943", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "2005", + "cpu-usage-user": "2261", + "cpu-utilization": 0, + "memory-usage": "77414400", + "memory-utilization": 1, + "name": "PortSec", + "pid": "943", + "start-time": "1622215688635663872" + } + }, + { + "pid": "367", + "state": { + "args": [ + "/usr/bin/inotifyrun -c pax -x sv4cpio -O -w -f /mnt/flash/persist/local.new . \u0026\u0026 mv /mnt/flash/persist/local.new /mnt/flash/persist/local || logger -t SetupPersist Failed to update /mnt/flash/persist/local --daemon --logfile=/var/log/inotifyrun-local.log --pidfile=/var/run/inotifyrun-local.pid /persist/local" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "5214208", + "memory-utilization": 0, + "name": "python", + "pid": "367", + "start-time": "1622215618635663872" + } + }, + { + "pid": "452", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "36", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "12582912", + "memory-utilization": 0, + "name": "netnsd-server", + "pid": "452", + "start-time": "1622215643635663872" + } + }, + { + "pid": "992", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "2232", + "cpu-usage-user": "2673", + "cpu-utilization": 0, + "memory-usage": "80261120", + "memory-utilization": 1, + "name": "L2Rib", + "pid": "992", + "start-time": "1622215689635663872" + } + }, + { + "pid": "479", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "83165", + "cpu-usage-user": "258040", + "cpu-utilization": 0, + "memory-usage": "21934080", + "memory-utilization": 0, + "name": "ProcMgr-worker", + "pid": "479", + "start-time": "1622215644635663872" + } + }, + { + "pid": "999", + "state": { + "args": [ + "--agenttitle=KernelFib --dlopen procmgr /usr/bin/KernelFib" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1634304", + "memory-utilization": 0, + "name": "netns", + "pid": "999", + "start-time": "1622215689635663872" + } + }, + { + "pid": "959", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1346", + "cpu-usage-user": "2865", + "cpu-utilization": 0, + "memory-usage": "79597568", + "memory-utilization": 1, + "name": "StpTopology", + "pid": "959", + "start-time": "1622215688635663872" + } + }, + { + "pid": "987", + "state": { + "args": [ + "--agenttitle=TopoAgent --dlopen procmgr /usr/bin/TopoAgent --scheduled" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1634304", + "memory-utilization": 0, + "name": "netns", + "pid": "987", + "start-time": "1622215689635663872" + } + }, + { + "pid": "955", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1821", + "cpu-usage-user": "2064", + "cpu-utilization": 0, + "memory-usage": "77361152", + "memory-utilization": 1, + "name": "FibServices", + "pid": "955", + "start-time": "1622215688635663872" + } + }, + { + "pid": "925", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1318", + "cpu-usage-user": "2777", + "cpu-utilization": 0, + "memory-usage": "79773696", + "memory-utilization": 1, + "name": "McastCommon", + "pid": "925", + "start-time": "1622215688635663872" + } + }, + { + "pid": "390", + "state": { + "args": [ + "/usr/bin/inotifyrun -c pax -x sv4cpio -O -w -f /mnt/flash/persist/secure.new . \u0026\u0026 sync \u0026\u0026 ( mv /mnt/flash/persist/secure /mnt/flash/persist/secure.old; mv /mnt/flash/persist/secure.new /mnt/flash/persist/secure; sync ) \u0026\u0026 ( scrub --no-signature /mnt/flash/persist/secure.old; rm /mnt/flash/persist/secure.old ) || logger -t SetupPersist Failed to update /mnt/flash/persist/secure --daemon --logfile=/var/log/inotifyrun-secure.log --pidfile=/var/run/inotifyrun-secure.pid /persist/secure" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "5169152", + "memory-utilization": 0, + "name": "python", + "pid": "390", + "start-time": "1622215618635663872" + } + }, + { + "pid": "1471", + "state": { + "args": [ + "-n 0 --retry --follow=name --pid=1469 /var/log/eos-console" + ], + "cpu-usage-system": "3166", + "cpu-usage-user": "581", + "cpu-utilization": 0, + "memory-usage": "589824", + "memory-utilization": 0, + "name": "tail", + "pid": "1471", + "start-time": "1622215703635663872" + } + }, + { + "pid": "376", + "state": { + "args": [ + "-m -r -e modify -e create -e delete -e attrib -e move ." + ], + "cpu-usage-system": "30", + "cpu-usage-user": "13", + "cpu-utilization": 0, + "memory-usage": "602112", + "memory-utilization": 0, + "name": "inotifywait", + "pid": "376", + "start-time": "1622215618635663872" + } + }, + { + "pid": "534", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "59508", + "cpu-usage-user": "114729", + "cpu-utilization": 0, + "memory-usage": "331501568", + "memory-utilization": 8, + "name": "ConfigAgent", + "pid": "534", + "start-time": "1622215645635663872" + } + }, + { + "pid": "1051", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "34477", + "cpu-usage-user": "51161", + "cpu-utilization": 0, + "memory-usage": "106369024", + "memory-utilization": 2, + "name": "Rib", + "pid": "1051", + "start-time": "1622215692635663872" + } + }, + { + "pid": "375", + "state": { + "args": [ + "/usr/bin/inotifyrun -c pax -x sv4cpio -O -w -f /mnt/flash/persist/sys.new . \u0026\u0026 mv /mnt/flash/persist/sys.new /mnt/flash/persist/sys || logger -t SetupPersist Failed to update /mnt/flash/persist/sys --daemon --logfile=/var/log/inotifyrun-sys.log --pidfile=/var/run/inotifyrun-sys.pid /persist/sys" + ], + "cpu-usage-system": "237", + "cpu-usage-user": "103", + "cpu-utilization": 0, + "memory-usage": "5050368", + "memory-utilization": 0, + "name": "python", + "pid": "375", + "start-time": "1622215618635663872" + } + }, + { + "pid": "230", + "state": { + "args": [ + "-n" + ], + "cpu-usage-system": "121", + "cpu-usage-user": "169", + "cpu-utilization": 0, + "memory-usage": "5382144", + "memory-utilization": 0, + "name": "rsyslogd", + "pid": "230", + "start-time": "1622215615635663872" + } + }, + { + "pid": "233", + "state": { + "args": [ + "--system --address=systemd: --nofork --nopidfile --systemd-activation" + ], + "cpu-usage-system": "2", + "cpu-usage-user": "10", + "cpu-utilization": 0, + "memory-usage": "9428992", + "memory-utilization": 0, + "name": "dbus-daemon", + "pid": "233", + "start-time": "1622215615635663872" + } + }, + { + "pid": "961", + "state": { + "args": [ + "--agenttitle=Acl --dlopen procmgr /usr/bin/Acl" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1548288", + "memory-utilization": 0, + "name": "netns", + "pid": "961", + "start-time": "1622215688635663872" + } + }, + { + "pid": "1470", + "state": { + "args": [ + "-c /usr/bin/tail -n 0 --retry --follow=name --pid=1469 /var/log/eos-console | sed 's/\\(.*\\)/\\1\\r/'" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "2473984", + "memory-utilization": 0, + "name": "sh", + "pid": "1470", + "start-time": "1622215703635663872" + } + }, + { + "pid": "1", + "state": { + "args": [ + "systemd.setenv=INTFTYPE=eth systemd.setenv=ETBA=4 systemd.setenv=SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 systemd.setenv=CEOS=1 systemd.setenv=EOS_PLATFORM=ceoslab systemd.setenv=container=docker systemd.setenv=MAPETH0=1 MGMT_INTF=eth0" + ], + "cpu-usage-system": "14444", + "cpu-usage-user": "5894", + "cpu-utilization": 0, + "memory-usage": "4837376", + "memory-utilization": 0, + "name": "systemd", + "pid": "1", + "start-time": "1622215611635663872" + } + }, + { + "pid": "1472", + "state": { + "args": [ + "s/\\(.*\\)/\\1\\r/" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1748992", + "memory-utilization": 0, + "name": "sed", + "pid": "1472", + "start-time": "1622215703635663872" + } + }, + { + "pid": "953", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "14921", + "cpu-usage-user": "24838", + "cpu-utilization": 0, + "memory-usage": "82567168", + "memory-utilization": 2, + "name": "StpTxRx", + "pid": "953", + "start-time": "1622215688635663872" + } + }, + { + "pid": "540", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1515", + "cpu-usage-user": "1666", + "cpu-utilization": 0, + "memory-usage": "80396288", + "memory-utilization": 1, + "name": "StageMgr", + "pid": "540", + "start-time": "1622215645635663872" + } + }, + { + "pid": "989", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "989", + "start-time": "1622215689635663872" + } + }, + { + "pid": "985", + "state": { + "args": [ + "--agenttitle=L2Rib --dlopen procmgr /usr/bin/L2Rib" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1564672", + "memory-utilization": 0, + "name": "netns", + "pid": "985", + "start-time": "1622215689635663872" + } + }, + { + "pid": "450", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "12652544", + "memory-utilization": 0, + "name": "netnsd-watcher", + "pid": "450", + "start-time": "1622215643635663872" + } + }, + { + "pid": "978", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "978", + "start-time": "1622215688635663872" + } + }, + { + "pid": "511", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1478", + "cpu-usage-user": "1659", + "cpu-utilization": 0, + "memory-usage": "92073984", + "memory-utilization": 2, + "name": "Fru", + "pid": "511", + "start-time": "1622215644635663872" + } + }, + { + "pid": "928", + "state": { + "args": [ + "--agenttitle=OpenConfig" + ], + "cpu-usage-system": "72139", + "cpu-usage-user": "232952", + "cpu-utilization": 1, + "memory-usage": "142307328", + "memory-utilization": 3, + "name": "OpenConfig", + "pid": "928", + "start-time": "1622215688635663872" + } + }, + { + "pid": "937", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "937", + "start-time": "1622215688635663872" + } + }, + { + "pid": "922", + "state": { + "args": [ + "--agenttitle=Lldp --dlopen procmgr /usr/bin/Lldp" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "1613824", + "memory-utilization": 0, + "name": "netns", + "pid": "922", + "start-time": "1622215688635663872" + } + }, + { + "pid": "986", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1578", + "cpu-usage-user": "1738", + "cpu-utilization": 0, + "memory-usage": "69849088", + "memory-utilization": 1, + "name": "ReloadCauseAgen", + "pid": "986", + "start-time": "1622215689635663872" + } + }, + { + "pid": "528", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1736", + "cpu-usage-user": "2075", + "cpu-utilization": 0, + "memory-usage": "104476672", + "memory-utilization": 2, + "name": "Launcher", + "pid": "528", + "start-time": "1622215645635663872" + } + }, + { + "pid": "1000", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "1000", + "start-time": "1622215689635663872" + } + }, + { + "pid": "616", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "17492", + "cpu-usage-user": "4887", + "cpu-utilization": 0, + "memory-usage": "2531328", + "memory-utilization": 0, + "name": "EosOomAdjust", + "pid": "616", + "start-time": "1622215646635663872" + } + }, + { + "pid": "923", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "923", + "start-time": "1622215688635663872" + } + }, + { + "pid": "1469", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "65536", + "memory-utilization": 0, + "name": "conlogd", + "pid": "1469", + "start-time": "1622215703635663872" + } + }, + { + "pid": "965", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "965", + "start-time": "1622215688635663872" + } + }, + { + "pid": "996", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1683", + "cpu-usage-user": "1812", + "cpu-utilization": 0, + "memory-usage": "78594048", + "memory-utilization": 1, + "name": "TopoAgent", + "pid": "996", + "start-time": "1622215689635663872" + } + }, + { + "pid": "973", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1395", + "cpu-usage-user": "3031", + "cpu-utilization": 0, + "memory-usage": "71913472", + "memory-utilization": 1, + "name": "KernelNetworkIn", + "pid": "973", + "start-time": "1622215688635663872" + } + }, + { + "pid": "952", + "state": { + "args": [ + " -d -i --dlopen -p -f -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize" + ], + "cpu-usage-system": "0", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "10809344", + "memory-utilization": 0, + "name": "netnsd-session", + "pid": "952", + "start-time": "1622215688635663872" + } + }, + { + "pid": "232", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "63", + "cpu-usage-user": "30", + "cpu-utilization": 0, + "memory-usage": "2740224", + "memory-utilization": 0, + "name": "systemd-logind", + "pid": "232", + "start-time": "1622215615635663872" + } + }, + { + "pid": "760747", + "state": { + "args": [ + "" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "2764800", + "memory-utilization": 0, + "name": "bash", + "pid": "760747", + "start-time": "1623004570635663872" + } + }, + { + "pid": "760756", + "state": { + "args": [ + " /usr/bin/Cli" + ], + "cpu-usage-system": "126", + "cpu-usage-user": "185", + "cpu-utilization": 0, + "memory-usage": "13238272", + "memory-utilization": 0, + "name": "CliShell", + "pid": "760756", + "start-time": "1623004573635663872" + } + }, + { + "pid": "760774", + "state": { + "args": [ + "-l" + ], + "cpu-usage-system": "1", + "cpu-usage-user": "0", + "cpu-utilization": 0, + "memory-usage": "2875392", + "memory-utilization": 0, + "name": "bash", + "pid": "760774", + "start-time": "1623004586635663872" + } + } + ] + }, + "ssh-server": { + "config": { + "enable": true, + "session-limit": 50, + "timeout": 0 + }, + "state": { + "enable": true, + "session-limit": 50, + "timeout": 0 + } + }, + "state": { + "boot-time": "1614091865635663872", + "current-datetime": "2021-03-05T14:34:17Z+00:00", + "hostname": "localhost" + } + } + } + } + } + ] + } +] diff --git a/test/cap-resp-arista-ceos b/test/cap-resp-arista-ceos new file mode 100644 index 0000000000000000000000000000000000000000..009569457324faf59d7bf00bb1915f2f3ccc2ec2 --- /dev/null +++ b/test/cap-resp-arista-ceos @@ -0,0 +1,298 @@ + +< +arista-exp-eos-vxlan$Arista Networks <http://arista.com/> +B +ietf-netconf2IETF NETCONF (Network Configuration) Working Group +< +arista-rpol-augments$Arista Networks <http://arista.com/> +C +arista-exp-eos-igmpsnooping$Arista Networks <http://arista.com/> +8 +openconfig-vlan-typesOpenConfig working group3.1.0 +? +openconfig-system-managementOpenConfig working group0.3.0 +8 +arista-eos-types$Arista Networks <http://arista.com/> +< +openconfig-openflow-typesOpenConfig working group0.1.2 +7 +openconfig-aaa-typesOpenConfig working group0.4.1 +9 +openconfig-srte-policyOpenConfig working group0.2.1 +9 +openconfig-relay-agentOpenConfig working group0.1.1 +C +openconfig-hercules-qos!OpenConfig Hercules Working Group0.1.0 +1 +openconfig-extensionsOpenConfig working group +/ +arista-mpls-deviationsArista Networks, Inc. +< +arista-vlan-augments$Arista Networks <http://arista.com/> +: +openconfig-platform-cpuOpenConfig working group0.1.1 +< +openconfig-routing-policyOpenConfig working group3.1.1 += +openconfig-isis-lsdb-typesOpenConfig working group0.4.2 +3 +openconfig-if-ipOpenConfig working group3.0.0 +; +arista-pim-augments$Arista Networks <http://arista.com/> +4 +openconfig-if-poeOpenConfig working group0.1.1 +- +arista-isis-augmentsArista Networks, Inc. +8 +openconfig-ospf-typesOpenConfig working group0.1.3 +/ +arista-intf-deviationsArista Networks, Inc. +5 +openconfig-mpls-srOpenConfig working group3.0.1 +: +openconfig-packet-matchOpenConfig working group1.1.1 +8 +openconfig-inet-typesOpenConfig working group0.3.3 +9 +openconfig-if-ethernetOpenConfig working group2.8.1 +5 +openconfig-pf-srteOpenConfig working group0.2.0 +2 +openconfig-mplsOpenConfig working group3.1.0 +# + +arista-cliArista Networks, Inc. += +openconfig-system-terminalOpenConfig working group0.3.1 +: +openconfig-platform-psuOpenConfig working group0.2.1 +8 +openconfig-yang-typesOpenConfig working group0.2.1 +8 +openconfig-lldp-typesOpenConfig working group0.1.1 +7 +openconfig-if-tunnelOpenConfig working group0.1.1 +6 +openconfig-messagesOpenConfig working group0.0.1 +B +openconfig-platform-transceiverOpenConfig working group0.7.1 +1 +openconfig-pimOpenConfig working group0.2.0 +@ +openconfig-packet-match-typesOpenConfig working group1.0.2 +C + openconfig-segment-routing-typesOpenConfig working group0.2.0 +: +openconfig-policy-typesOpenConfig working group3.1.1 +/ +arista-lldp-deviationsArista Networks, Inc. +B +openconfig-network-instance-l3OpenConfig working group0.11.1 +E +arista-exp-eos-qos-acl-config$Arista Networks <http://arista.com/> +5 +openconfig-licenseOpenConfig working group0.2.0 +: +openconfig-platform-fanOpenConfig working group0.1.1 +/ +arista-system-augmentsArista Networks, Inc. +2 +openconfig-isisOpenConfig working group0.6.0 +H +/arista-network-instance-notsupported-deviationsArista Networks, Inc. +B +)arista-interfaces-notsupported-deviationsArista Networks, Inc. +< +arista-mpls-augments$Arista Networks <http://arista.com/> +3 +arista-openflow-deviationsArista Networks, Inc. +7 +openconfig-platformOpenConfig working group0.12.2 +D +arista-exp-eos-varp-net-inst$Arista Networks <http://arista.com/> +9 +openconfig-ospf-policyOpenConfig working group0.1.3 +6 +openconfig-if-typesOpenConfig working group0.2.1 +: +arista-exp-eos-qos$Arista Networks <http://arista.com/> +2 +openconfig-igmpOpenConfig working group0.2.0 +) +arista-gnoi-certArista Networks, Inc. +/ +arista-isis-deviationsArista Networks, Inc. +4 +openconfig-systemOpenConfig working group0.9.1 +> +arista-vlan-deviations$Arista Networks <http://arista.com/> +# +vlan-translationArista Networks +; +openconfig-local-routingOpenConfig working group1.1.0 +@ +arista-exp-eos-varp-intf$Arista Networks <http://arista.com/> +; +arista-exp-eos-mlag$Arista Networks <http://arista.com/> +8 +openconfig-igmp-typesOpenConfig working group0.1.1 +1 +openconfig-aftOpenConfig working group0.4.1 +- +arista-srte-augmentsArista Networks, Inc. +E +arista-relay-agent-deviations$Arista Networks <http://arista.com/> +7 +openconfig-mpls-rsvpOpenConfig working group3.0.2 +1 +openconfig-aaaOpenConfig working group0.4.3 +6 +arista-exp-eos$Arista Networks <http://arista.com/> +H +openconfig-hercules-platform!OpenConfig Hercules Working Group0.2.0 +. +arista-acl-deviationsArista Networks, Inc. +/ +arista-lacp-deviationsArista Networks, Inc. +? +ietf-interfaces,IETF NETMOD (Network Modeling) Working Group +. +arista-bgp-deviationsArista Networks, Inc. +< +openconfig-platform-typesOpenConfig working group1.0.0 +; +"arista-acl-notsupported-deviationsArista Networks, Inc. +3 +openconfig-typesOpenConfig working group0.6.0 +M +ietf-yang-types:IETF NETMOD (NETCONF Data Modeling Language) Working Group +1 +openconfig-qosOpenConfig working group0.2.3 +. +arista-bfd-deviationsArista Networks, Inc. +@ +'arista-messages-notsupported-deviationsArista Networks, Inc. +9 +openconfig-alarm-typesOpenConfig working group0.2.1 +< +#arista-exp-eos-l2protocolforwardingArista Networks, Inc. +6 +openconfig-openflowOpenConfig working group0.1.2 +> +%arista-system-notsupported-deviationsArista Networks, Inc. +7 +openconfig-pim-typesOpenConfig working group0.1.1 +2 +openconfig-vlanOpenConfig working group3.2.0 +F +-arista-routing-policy-notsupported-deviationsArista Networks, Inc. +7 +openconfig-aft-typesOpenConfig Working Group0.3.4 +, +arista-aft-augmentsArista Networks, Inc. +< +arista-lacp-augments$Arista Networks <http://arista.com/> +1 +openconfig-bfdOpenConfig working group0.2.1 +< +openconfig-system-loggingOpenConfig working group0.3.1 +4 +openconfig-alarmsOpenConfig working group0.3.2 +8 +openconfig-isis-typesOpenConfig working group0.4.2 +? +openconfig-platform-linecardOpenConfig working group0.1.2 +< +#arista-lldp-notsupported-deviationsArista Networks, Inc. +, +arista-exp-eos-evpnArista Networks, Inc. +5 +openconfig-rib-bgpOpenConfig working group0.7.0 +@ +'arista-platform-notsupported-deviationsArista Networks, Inc. +@ +arista-exp-eos-multicast$Arista Networks <http://arista.com/> +; +"arista-bfd-notsupported-deviationsArista Networks, Inc. +? +openconfig-policy-forwardingOpenConfig working group0.2.1 +2 +openconfig-lacpOpenConfig working group1.1.1 +- +arista-lldp-augmentsArista Networks, Inc. +; +arista-bfd-augments$Arista Networks <http://arista.com/> +1 +openconfig-bgpOpenConfig working group6.0.0 + +iana-if-typeIANA +/ +arista-rpol-deviationsArista Networks, Inc. +; +openconfig-rib-bgp-typesOpenConfig working group0.5.0 +M +ietf-inet-types:IETF NETMOD (NETCONF Data Modeling Language) Working Group +8 +openconfig-bgp-policyOpenConfig working group6.0.1 +< +arista-intf-augments$Arista Networks <http://arista.com/> +8 +arista-local-routing-deviationsArista Networks, Inc. +8 +openconfig-interfacesOpenConfig working group2.4.3 +: +openconfig-if-aggregateOpenConfig working group2.4.3 +/ +arista-srte-deviationsArista Networks, Inc. +A +arista-exp-eos-qos-config$Arista Networks <http://arista.com/> +2 +openconfig-lldpOpenConfig working group0.2.1 +J +openconfig-hercules-interfaces!OpenConfig Hercules Working Group0.2.0 +6 +openconfig-mpls-ldpOpenConfig working group3.0.2 +8 +openconfig-mpls-typesOpenConfig working group3.2.0 +M +ietf-netconf-monitoring2IETF NETCONF (Network Configuration) Working Group +7 +openconfig-bgp-typesOpenConfig working group5.2.0 +< +#arista-lacp-notsupported-deviationsArista Networks, Inc. +E +,arista-local-routing-notsupported-deviationsArista Networks, Inc. +, +arista-bgp-augmentsArista Networks, Inc. +2 +arista-netinst-deviationsArista Networks, Inc. +; +"arista-bgp-notsupported-deviationsArista Networks, Inc. +D +!openconfig-network-instance-typesOpenConfig working group0.8.2 +1 +openconfig-aclOpenConfig working group1.1.1 +7 +openconfig-qos-typesOpenConfig working group0.2.1 +5 +openconfig-procmonOpenConfig working group0.4.0 +, +arista-qos-augmentsArista Networks, Inc. +; +openconfig-platform-portOpenConfig working group0.3.3 +4 +openconfig-ospfv2OpenConfig working group0.2.2 +1 +arista-system-deviationsArista Networks, Inc. +> +openconfig-transport-typesOpenConfig working group0.11.0 +? +openconfig-network-instanceOpenConfig working group0.14.0 ++ +arista-rpc-netconfArista Networks, Inc. += +openconfig-segment-routingOpenConfig working group0.3.0 +; +"arista-qos-notsupported-deviationsArista Networks, Inc. +C +arista-exp-eos-vxlan-config$Arista Networks <http://arista.com/>�0.7.0 \ No newline at end of file diff --git a/test_resources/req-full-node b/test/req-full-node similarity index 100% rename from test_resources/req-full-node rename to test/req-full-node diff --git a/test/req-full-node-arista-ceos b/test/req-full-node-arista-ceos new file mode 100644 index 0000000000000000000000000000000000000000..6223295e2984b8002ea5573e8fbbecb77ba9dc6d Binary files /dev/null and b/test/req-full-node-arista-ceos differ diff --git a/test/req-interfaces-arista-ceos b/test/req-interfaces-arista-ceos new file mode 100644 index 0000000000000000000000000000000000000000..e444e33aa6d44fc9ca4538f5a030df6c8d88a708 --- /dev/null +++ b/test/req-interfaces-arista-ceos @@ -0,0 +1,5 @@ + + +interfaces + +interfaces( \ No newline at end of file diff --git a/test/req-interfaces-interface-arista-ceos b/test/req-interfaces-interface-arista-ceos new file mode 100644 index 0000000000000000000000000000000000000000..087f7d8275a07a95d6809081bab6ccecfa81a9f1 --- /dev/null +++ b/test/req-interfaces-interface-arista-ceos @@ -0,0 +1,7 @@ +2 + +interfaces + interface + +interfaces + interface( \ No newline at end of file diff --git a/test_resources/req-interfaces-wildcard b/test/req-interfaces-wildcard similarity index 100% rename from test_resources/req-interfaces-wildcard rename to test/req-interfaces-wildcard diff --git a/test_resources/resp-full-node b/test/resp-full-node similarity index 100% rename from test_resources/resp-full-node rename to test/resp-full-node diff --git a/test/resp-full-node-arista-ceos b/test/resp-full-node-arista-ceos new file mode 100644 index 0000000000000000000000000000000000000000..9bcd16e666a683a570c5141eb01b4ed16ad52b8b Binary files /dev/null and b/test/resp-full-node-arista-ceos differ diff --git a/test/resp-interfaces-arista-ceos b/test/resp-interfaces-arista-ceos new file mode 100644 index 0000000000000000000000000000000000000000..58e139172f4264b079f1f61ec7f27fe454129734 --- /dev/null +++ b/test/resp-interfaces-arista-ceos @@ -0,0 +1,5 @@ + +�"� + + +interfaces�Z�{"openconfig-interfaces:interface":[{"config":{"description":"","enabled":true,"arista-intf-augments:load-interval":300,"loopback-mode":false,"mtu":0,"name":"Ethernet510","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-if-ethernet:ethernet":{"config":{"arista-intf-augments:fec-encoding":{"disabled":false,"fire-code":false,"reed-solomon":false,"reed-solomon544":false},"openconfig-hercules-interfaces:forwarding-viable":true,"mac-address":"00:00:00:00:00:00","port-speed":"SPEED_UNKNOWN","arista-intf-augments:sfp-1000base-t":false},"arista-intf-augments:pfc":{"priorities":{"priority":[{"index":0,"state":{"in-frames":"0","index":0,"out-frames":"0"}},{"index":1,"state":{"in-frames":"0","index":1,"out-frames":"0"}},{"index":2,"state":{"in-frames":"0","index":2,"out-frames":"0"}},{"index":3,"state":{"in-frames":"0","index":3,"out-frames":"0"}},{"index":4,"state":{"in-frames":"0","index":4,"out-frames":"0"}},{"index":5,"state":{"in-frames":"0","index":5,"out-frames":"0"}},{"index":6,"state":{"in-frames":"0","index":6,"out-frames":"0"}},{"index":7,"state":{"in-frames":"0","index":7,"out-frames":"0"}}]}},"state":{"auto-negotiate":false,"counters":{"in-crc-errors":"0","in-fragment-frames":"0","in-jabber-frames":"0","in-mac-control-frames":"0","in-mac-pause-frames":"0","in-oversize-frames":"0","out-mac-control-frames":"0","out-mac-pause-frames":"0"},"duplex-mode":"FULL","enable-flow-control":false,"openconfig-hercules-interfaces:forwarding-viable":true,"hw-mac-address":"02:42:c0:a8:02:42","mac-address":"02:42:c0:a8:02:42","negotiated-port-speed":"SPEED_UNKNOWN","port-speed":"SPEED_UNKNOWN","arista-intf-augments:supported-speeds":["SPEED_200GB_8LANE","SPEED_100MB","SPEED_1GB","SPEED_10GB","SPEED_400GB","SPEED_40GB","SPEED_2500MB","SPEED_50GB","SPEED_50GB_1LANE","SPEED_25GB","SPEED_100GB","SPEED_100GB_2LANE","SPEED_10MB","SPEED_200GB_4LANE","SPEED_5GB"]}},"hold-time":{"config":{"down":0,"up":0},"state":{"down":0,"up":0}},"name":"Ethernet510","state":{"admin-status":"UP","counters":{"in-broadcast-pkts":"344691","in-discards":"0","in-errors":"0","in-fcs-errors":"0","in-multicast-pkts":"1","in-octets":"93260151","in-unicast-pkts":"0","out-broadcast-pkts":"0","out-discards":"0","out-errors":"0","out-multicast-pkts":"0","out-octets":"0","out-unicast-pkts":"0"},"description":"","enabled":true,"openconfig-platform-port:hardware-port":"Port510","ifindex":510,"arista-intf-augments:inactive":false,"last-change":"1614091948142304000","loopback-mode":false,"mtu":0,"name":"Ethernet510","oper-status":"UP","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"subinterfaces":{"subinterface":[{"config":{"description":"","enabled":true,"index":0},"index":0,"openconfig-if-ip:ipv4":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500},"unnumbered":{"config":{"enabled":false},"state":{"enabled":false}}},"openconfig-if-ip:ipv6":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500}},"state":{"counters":{"in-fcs-errors":"0"},"description":"","enabled":true,"index":0}}]}}]} \ No newline at end of file diff --git a/test/resp-interfaces-interface-arista-ceos b/test/resp-interfaces-interface-arista-ceos new file mode 100644 index 0000000000000000000000000000000000000000..05f0804b1153e5982ff5d5e4d4a32d9d6d6be7d0 --- /dev/null +++ b/test/resp-interfaces-interface-arista-ceos @@ -0,0 +1,7 @@ + +�"� +0 + +interfaces + interface +nameEthernet510�Z�{"openconfig-interfaces:config":{"description":"","enabled":true,"arista-intf-augments:load-interval":300,"loopback-mode":false,"mtu":0,"name":"Ethernet510","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-if-ethernet:ethernet":{"config":{"arista-intf-augments:fec-encoding":{"disabled":false,"fire-code":false,"reed-solomon":false,"reed-solomon544":false},"openconfig-hercules-interfaces:forwarding-viable":true,"mac-address":"00:00:00:00:00:00","port-speed":"SPEED_UNKNOWN","arista-intf-augments:sfp-1000base-t":false},"arista-intf-augments:pfc":{"priorities":{"priority":[{"index":0,"state":{"in-frames":"0","index":0,"out-frames":"0"}},{"index":1,"state":{"in-frames":"0","index":1,"out-frames":"0"}},{"index":2,"state":{"in-frames":"0","index":2,"out-frames":"0"}},{"index":3,"state":{"in-frames":"0","index":3,"out-frames":"0"}},{"index":4,"state":{"in-frames":"0","index":4,"out-frames":"0"}},{"index":5,"state":{"in-frames":"0","index":5,"out-frames":"0"}},{"index":6,"state":{"in-frames":"0","index":6,"out-frames":"0"}},{"index":7,"state":{"in-frames":"0","index":7,"out-frames":"0"}}]}},"state":{"auto-negotiate":false,"counters":{"in-crc-errors":"0","in-fragment-frames":"0","in-jabber-frames":"0","in-mac-control-frames":"0","in-mac-pause-frames":"0","in-oversize-frames":"0","out-mac-control-frames":"0","out-mac-pause-frames":"0"},"duplex-mode":"FULL","enable-flow-control":false,"openconfig-hercules-interfaces:forwarding-viable":true,"hw-mac-address":"02:42:c0:a8:02:42","mac-address":"02:42:c0:a8:02:42","negotiated-port-speed":"SPEED_UNKNOWN","port-speed":"SPEED_UNKNOWN","arista-intf-augments:supported-speeds":["SPEED_200GB_8LANE","SPEED_100MB","SPEED_1GB","SPEED_10GB","SPEED_400GB","SPEED_40GB","SPEED_2500MB","SPEED_50GB","SPEED_50GB_1LANE","SPEED_25GB","SPEED_100GB","SPEED_100GB_2LANE","SPEED_10MB","SPEED_200GB_4LANE","SPEED_5GB"]}},"openconfig-interfaces:hold-time":{"config":{"down":0,"up":0},"state":{"down":0,"up":0}},"openconfig-interfaces:name":"Ethernet510","openconfig-interfaces:state":{"admin-status":"UP","counters":{"in-broadcast-pkts":"344691","in-discards":"0","in-errors":"0","in-fcs-errors":"0","in-multicast-pkts":"1","in-octets":"93260151","in-unicast-pkts":"0","out-broadcast-pkts":"0","out-discards":"0","out-errors":"0","out-multicast-pkts":"0","out-octets":"0","out-unicast-pkts":"0"},"description":"","enabled":true,"openconfig-platform-port:hardware-port":"Port510","ifindex":510,"arista-intf-augments:inactive":false,"last-change":"1614091948142304000","loopback-mode":false,"mtu":0,"name":"Ethernet510","oper-status":"UP","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-interfaces:subinterfaces":{"subinterface":[{"config":{"description":"","enabled":true,"index":0},"index":0,"openconfig-if-ip:ipv4":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500},"unnumbered":{"config":{"enabled":false},"state":{"enabled":false}}},"openconfig-if-ip:ipv6":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500}},"state":{"counters":{"in-fcs-errors":"0"},"description":"","enabled":true,"index":0}}]}} \ No newline at end of file diff --git a/test_resources/resp-interfaces-wildcard b/test/resp-interfaces-wildcard similarity index 100% rename from test_resources/resp-interfaces-wildcard rename to test/resp-interfaces-wildcard diff --git a/test_resources/targets.go b/test/targets.go similarity index 99% rename from test_resources/targets.go rename to test/targets.go index 7aa3d84999e972ba0706641e048c40aa0c1f31c9..b9c30787f451dcc445c9a50ff35bbd382b7ab385 100644 --- a/test_resources/targets.go +++ b/test/targets.go @@ -1,4 +1,4 @@ -package test_resources +package test import ( "code.fbi.h-da.de/cocsn/gosdn/forks/google/gnmi" diff --git a/test/terraform/.docker/ca.pem b/test/terraform/.docker/ca.pem new file mode 100644 index 0000000000000000000000000000000000000000..335627f7a9eaf379a5c7551d9567a8699da16a44 --- /dev/null +++ b/test/terraform/.docker/ca.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgIUBWq9uklhkW5VulP/hnERK3IgadswDQYJKoZIhvcNAQEL +BQAwazELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEkMCIGA1UEAwwbcG9ydGFpbmVyLmRh +bmV0LmZiaS5oLWRhLmRlMB4XDTIxMDMwMjE0MzEwN1oXDTIyMDMwMjE0MzEwN1ow +azELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu +dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEkMCIGA1UEAwwbcG9ydGFpbmVyLmRhbmV0 +LmZiaS5oLWRhLmRlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1tx8 +n9HeLdXWMprKS/+8qrC2YITG27BLGTNXPbunks7CyLhJo7G2DqFtYuhLqtBESVw0 +1MJIoGnHbi0cT7bUCRUmp3V+qUzKih5gcIndkwftEUh0IVGf+CuKAdV7l/W95pvY +s8Qt8jn8FU7dQddUhdy3cQSsbIQU1cBHUNzE0RpaHnIv713eHSYhXDb/EuxlH8r+ +cavx89OAqouesMY7TVDTyHhwVefnDvSX4KsCbcK4DtwZA/jwyx/LaPs32vFwX+zw +USH+twA37lbOrYNPgFKLX4gxJ33DvP61DZ/3Sn9YwJK1Jc5O5kRRHVFaSwSouAC5 +YOvRhnaRejrqpep9F8WX/feMSWEsa2LBjdJfWV7AXLNJAH1SbyUMlUM83bYvcYDM +ecy6wor4CSWHKjHitcO9GLlJb6nnAT2eZxv5tX4FzmN1Wftzo6NMkaETeYft6tFC +eoJ1beQpjkRB/O3DVN4m0KGtwUcIm3EB/gxMy5TuYvSimEQ/w4sXHpCwNFmu98Xz +TjfCkNT7T9oJYBlltb1opEeT+UG2t6gqIbjyqia7FjTH/kGJrk2Y6ZHrnYfC/JAw +nBPiEK7O5RkaKMx8ZeLlYcG+Er7zU6S7IP6Lysg8JA6Ay86ixstdEwU3JqdPe3E5 +ooaZRjH7gYj3A5R3wk59FyKs3eud/nrMJM8lQO8CAwEAAaNTMFEwHQYDVR0OBBYE +FBMgzW9McSbOw2ECqj8xjRHaZdF+MB8GA1UdIwQYMBaAFBMgzW9McSbOw2ECqj8x +jRHaZdF+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAB6eUXxJ +rMVbSy1iskHV+c9WV5ZGIMwMgspir+U9/n8B+psONjWcQjWe4VFkvBlW82cEF3rY +Rz2cy4e5qtNpctPZfvta1qNNVsGSVTHNXBFU4ZFikKHTzso9eYuGEO77lBhv5j8Y +oPB/dPf2rXi6k+37MIbSHdAXHsNlGkYSkf+nvZ5h/kkUqKAAdy8fdcqeRlyGZblq +Ype83FgE+VNXGenf+tGaiX+nfoPUc+2C8LxkQWzJ9SN2XLu9q8Tl7PzE6Zyq14lQ +1H2rF++/CIbCpMy4/OOct+HvpCuAs53OD+g3fHsKAHgrrEp3WLn++uxlziPT87Sn +ErpmdhmSwIsbRBiHQgVfJRSRKhvaq6HqOOD8KnEEF5gdr3CnGLsG6OsErv3M3soh +hwVrEtzyle4chG2yi1P+szIDYRldbQX4p1BAHEAaV5DXkZMbgUWdtPxI3bumFyR4 +2DXFGFJIsiT8t6bIM1irBOMPiiST1bOqV1sm49RKQ7mer7K6P03kCvnhesk+/+Ak +1486CazHC2G9xWlMXwAK8vh1SB0uz9n9vN1OInzjozopAW/jJH+n56wYiH8odeu+ +cPdmmGd8hlC8gT5NFfmJxCGZ1IlU9oj24aIanV8RRDQoieqcTiIc+XxjhodbvaQi +H1G8DOOV2NajwyqtTyfsJOs1Yqhn2pRnYmv+ +-----END CERTIFICATE----- diff --git a/test/terraform/.docker/cert.pem b/test/terraform/.docker/cert.pem new file mode 100644 index 0000000000000000000000000000000000000000..c9f5c48e93766f0e06d1953fbd5e3dff0bc2dd86 --- /dev/null +++ b/test/terraform/.docker/cert.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFJDCCAwygAwIBAgIUWCLw3cqcoQ3g78lzu9SzfnD+GYYwDQYJKoZIhvcNAQEL +BQAwazELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEkMCIGA1UEAwwbcG9ydGFpbmVyLmRh +bmV0LmZiaS5oLWRhLmRlMB4XDTIxMDMwMjE0MzUwOFoXDTIyMDMwMjE0MzUwOFow +FDESMBAGA1UEAwwJdGVycmFmb3JtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA3vemPQNkpinIXLWjfZz1S6bSgxEvv2CDO2qf+/agCqE1dP2cfHyuodTh +D+sste8btSV1a8TiixJ+2U2sVykryYLWd27VUBvFYm6j/MIG9h17iOH2bALXuBU6 +PQ6K7fJwZgunOL0IK5lYLWbacA6CiF/4rwAsaeR1p5TLWz9/1ncLuwqYv8htvvsW +LintokYX+7q2iU0uoOnKPNkMvSwYgZ4JR1XBXWxd9wrJEd7Q5MfqqPFP9uEBDeXl ++nxYrxiNAhvBAxoAV141hH/3nj6wMiReWDW0ZgRRHHiG+B8fZVSYrA6j8n6O2IB0 +wBwaem85Fa+NDMJ4GUWLS7HJsh3ld906FClrjCr30AeqES4UUTnLXwSRtyrxufTH +oK7WAqp7MRusMxohVfAky6Uj0qKtlgJwNQoUjjnVjNTP8DrHkPoFeJ8x7gcpw/ue +yylDyLRh8RSnrQrMOw/7iT6k/G2JAb/c3GupOfNCFhZ0gVbJd2cdFohqmCo0L8mV +Rb38zDORyRBZccM0b8GHayLbefy2yYSHjLZaZJueAUwwPnn6QnOpDLqj+gpoLu/g +6ah2O0PqpievKubUyNIRZct3A82JZ9usF2FD6MqkhFzx/4w9YaKUGSpT2khru8Hg +AiGhdjV/pI603EKg3N6qQxvkmGPM4jkgNTAgNdVM7lovoKiOf18CAwEAAaMXMBUw +EwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAE3SVAwei8Mk +SzZsXCrgXaWdfaV3XnEJh8KPXdIXgNXXHYjJhdUssQz9X1dD3hzGlrME+aTRuVTS +wcgfJOLZUovIk3955TM+rCs/L86DvxAwZ733mE0k9BmEaG5J+4ZdkezD0BxWsFxR +i/IBcc7o03cx4Z7ocqGl4Z+sLsbG7Y3tXElILfk/6W3AbN/Yi52UCfkg3ugnr3q+ +hrv57fIE35WhXXld7jTf33WOc82JFMbJ1kwVMF9T6blny0RwN98PTzYwVy8Zofaa +Cuun8VA7pYhiOD1Ej+LVytKBcsin79mNFyQO2ZO78ByE19vtgSWn6HD1LHlfJ7J6 +oKyLWWNk95EaFTY7Y+0vFbLbtXASCfvIb1QfFQ4xiIn/V9osOgUjgyPRvaE6GldG +zAAbbBSaRtVTElV61cSqekubsqyuPM8p/G6Ai8M4ZVBtX0+wUQetC+jV6TOTcX54 +bVNf2YNz9iwvSzVU7hwtl7sQskmcoVxnIYIO0KIS6C/5LYGnN8z/gyb4lMxIHxF3 +PweMfPEUH1xG8Ob0IFOGli7mMIIoRmBBfEjI5VDbVso8Bm6EH+VXDqAO5hF7YRSO +nHKZXqAowrXDtG9pBQvJJGdO3AOlwEF4lNWjvQSbThVw/9gnOTOFuI5AkHsQFgvN +BakHe9onKWI9CIt4o3hra6Pi8DgZWYHF +-----END CERTIFICATE----- diff --git a/test/terraform/.docker/server-cert.pem b/test/terraform/.docker/server-cert.pem new file mode 100644 index 0000000000000000000000000000000000000000..a5899ae7f8646bda3b1115d5e1763f43be7c52b0 --- /dev/null +++ b/test/terraform/.docker/server-cert.pem @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIUWCLw3cqcoQ3g78lzu9SzfnD+GYUwDQYJKoZIhvcNAQEL +BQAwazELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEkMCIGA1UEAwwbcG9ydGFpbmVyLmRh +bmV0LmZiaS5oLWRhLmRlMB4XDTIxMDMwMjE0MzMxMFoXDTIyMDMwMjE0MzMxMFow +JjEkMCIGA1UEAwwbcG9ydGFpbmVyLmRhbmV0LmZiaS5oLWRhLmRlMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxD+yXHFK9796DnvnheJLf5Mc+h5Os8Bu +NgCI/6lixs06EUso0w4Th/YHH3dHdLUVEXbOPpXHHbEP37/J6eJk019goSZnafQM +4KS6X/sYid4GTLVjn/JrFvrMKmXfthMYB2i9afcoc8UI6qbDQ0JR6rsy0H5CRnrk +mWT6fSA2wscKnDniQTlkpM6CpEeywGgD7Ph40hlsOyXFQDv9ORdLnmHaC1bqCedK +UEmDI4RnoKv/aEspYHv+ooaPE0mX/wqkZkPK6PIR30OX7zrNH0wFYZNRtQVn0Y0G +DUcFB1yjaiVQnbxwm8qtvIFWR1EAE8nWXm4ikP7GCOw5g0Idqz+woqDci0utVIh5 +E5IAvQpajEY8nFyWDVDOcgm2D2oJkuWU1hpD186hILr6ZjmIR/3ZrN9DiPXtK68+ +8/VBPzRjOtsgtx/9JYUVrVH1BoBkvRSKf6CcroNMqupsHeeR2EcFpFuLSVLYx039 +d8otyxD8R05uaPeDroCNh4RJ++fyVI/M5PijA6LOWgzJhc+iJRcRA/zflpKOUs2y +W7hl1GUtyK8lwE3BozKcOgZ9kKWYB6Aw3kZNdwnQnnFvt/PK+SZsdd5ZaHErGW6h +rQKAieL9w6Ls9SrsWmGocb++OvizgMMS0wMXlSGgkWNNny44IdQZWjc7TqN8uObe +c/qSZ3lnWx8CAwEAAaNLMEkwMgYDVR0RBCswKYIbcG9ydGFpbmVyLmRhbmV0LmZi +aS5oLWRhLmRlhwSNZEaqhwR/AAABMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqG +SIb3DQEBCwUAA4ICAQC+c5hxSzmtS/BlOWHUZQIj9PKFTfMFdSau/rXGpZF1kSfr +tvAjHgRxiQiZWDS3XN5UfA7YD3IDwjAL+WmA4V13K5JMjSUR5WPu0eMq/IGHLVMQ +xaWAbcpRMzORTRfRWz2ecI4Zr4N8p8Rc5WnHzLoszAMXFrHmFAZOihFSOGSBHqxB +ez4udZ0sa+ZErrPx60OdsO4UGGWxxqxlJtMFyJDyLAYyOF7hhapBvFvP0ELG8Ep3 +uI2mbrDd75o9dLNUyiH3M0mcOeldLdvwEvhCaZn2bIwQBwXMMFb9WW5wp0vOF/kA +6uy/0Ix5Fmfx2ZUZrm28fLK0vd1277t7WXsKL9lojTgeP4UnlvahYkBLISZp8Az8 +g1T0kiIeOkqAnmEKBbSyNy/QvssCkA9C2r3P80O5Ry5orPujDHt6UlUyahDisBw2 +Cy3IfhIZbtvkTS6xTx7Ns2WC3euFFgcnmGbYWClJ3SjP8tJkjN6kBNEVC9FKKv58 +ug69HVRedU91iyXEToW93Myicv42AUojUB9NsGmTVbEvRszw03+rduERJjIevUG5 +miMAKMHy/2o7ZE/i8yBcTLnTfXCV/hr4qvBbhCVN/evnxVk8mdsrnaqJUX4ppN2r +doJi9xROeWDpK9UfsxuBpY/GhPUimcMOlsTV9bGAhPmj9qy/ikJrgUlKxwf0+A== +-----END CERTIFICATE----- diff --git a/test/terraform/containers.tf b/test/terraform/containers.tf new file mode 100644 index 0000000000000000000000000000000000000000..a6e381a9169eef45337aaf0b843bc1c89ddebef0 --- /dev/null +++ b/test/terraform/containers.tf @@ -0,0 +1,56 @@ +resource "docker_container" "gosdn" { + depends_on = [ + docker_container.ceos] + name = "contoller-${random_id.server.hex}" + image = docker_image.gosdn.name + restart = "always" + + ports { + internal = 55055 + external = 5555 + } + + env = [ + "GOSDN_DEBUG=", + ] +} + +# create arista container +# namespace is french cheeses +resource "docker_container" "ceos" { + name = "ceos-${random_id.server.hex}" + image = docker_image.ceos.name + restart = "always" + + ports { + internal = 6030 + external = 6030 + } + + networks_advanced { + name = "bridge" + } + + command = ["/sbin/init", + "systemd.setenv=INTFTYPE=eth", + "systemd.setenv=ETBA=4", + "systemd.setenv=SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1", + "systemd.setenv=CEOS=1", + "systemd.setenv=EOS_PLATFORM=ceoslab", + "systemd.setenv=container=docker", + "MGMT_INTF=eth0"] + + env = ["INTFTYPE=eth", + "ETBA=4", + "SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1", + "CEOS=1", + "EOS_PLATFORM=ceoslab", + "container=docker", + "MGMT_INTF=eth0"] + privileged = true + + volumes { + host_path = "/usr/local/etc/terraform/arista" + container_path = "/mnt/flash" + } +} diff --git a/test/terraform/images.tf b/test/terraform/images.tf new file mode 100644 index 0000000000000000000000000000000000000000..39d234b387f5b14a704a028b6b7f31f39a217218 --- /dev/null +++ b/test/terraform/images.tf @@ -0,0 +1,7 @@ +resource "docker_image" "gosdn" { + name = var.container_tag +} + +resource "docker_image" "ceos" { + name = "registry.code.fbi.h-da.de/cocsn/gosdn/ceos:latest" +} \ No newline at end of file diff --git a/test/terraform/main.tf b/test/terraform/main.tf new file mode 100644 index 0000000000000000000000000000000000000000..1f228766349903fbad196dbd3b1df05324f8c70b --- /dev/null +++ b/test/terraform/main.tf @@ -0,0 +1,9 @@ +terraform { + backend "http" { + } + required_providers { + docker = { + source = "kreuzwerker/docker" + } + } +} diff --git a/test/terraform/networks.tf b/test/terraform/networks.tf new file mode 100644 index 0000000000000000000000000000000000000000..2372a310a9d9c239419a706a22ffc809fb05a64a --- /dev/null +++ b/test/terraform/networks.tf @@ -0,0 +1,15 @@ +resource "docker_network" "danet_legacy" { + name = "legacy-${random_id.server.hex}" + + ipam_config { + subnet = "172.100.100.0/24" + } +} + +resource "docker_network" "danet" { + name = "danet-${random_id.server.hex}" + ipv6 = true + ipam_config { + subnet = "fdfe::/64" + } +} \ No newline at end of file diff --git a/test/terraform/providers.tf b/test/terraform/providers.tf new file mode 100644 index 0000000000000000000000000000000000000000..8da71dbfed7b68768fdae4985e95284f27212b9a --- /dev/null +++ b/test/terraform/providers.tf @@ -0,0 +1,13 @@ +provider "docker" { + host = "tcp://141.100.70.171:2376" + + ca_material = var.tls_ca_cert + cert_material = var.tls_cert + key_material = var.tls_key + + registry_auth { + address = var.integration_registry + username = var.integration_username + password = var.integration_access_token + } +} \ No newline at end of file diff --git a/test/terraform/resources.tf b/test/terraform/resources.tf new file mode 100644 index 0000000000000000000000000000000000000000..9659f2d949aaa978b04167a7a62d1a0dcc6752eb --- /dev/null +++ b/test/terraform/resources.tf @@ -0,0 +1,3 @@ +resource "random_id" "server" { + byte_length = 8 +} diff --git a/test/terraform/variables.tf b/test/terraform/variables.tf new file mode 100644 index 0000000000000000000000000000000000000000..beacac0158789901783dad04be71645d0cb2a697 --- /dev/null +++ b/test/terraform/variables.tf @@ -0,0 +1,32 @@ +variable "integration_registry" { + type = string +} + +variable "integration_username" { + type = string +} + +variable "integration_access_token" { + type = string +} +variable "tls_key" { + type = string +} + +variable "tls_cert" { + type = string +} + +variable "tls_ca_cert" { + type = string +} + +variable "container_tag" { + type = string + default = "registry.code.fbi.h-da.de/cocsn/gosdn:latest" +} + +variable "network_name" { + type = string + default = "" +} \ No newline at end of file