From e77b6850cde8927183cab63109d6d3a1e22c0d86 Mon Sep 17 00:00:00 2001 From: Rutvik Shiyani <88027613+RutvikS-crest@users.noreply.github.com> Date: Mon, 25 Oct 2021 01:10:19 -0700 Subject: [PATCH] Added support for tacacs-source (#147) * Added support for tacacs-source * Updated Model --- client/tacacsSrc_service.go | 93 ++++++++++++++++++++++++++++++++++ models/tacacs_src.go | 99 +++++++++++++++++++++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 client/tacacsSrc_service.go create mode 100644 models/tacacs_src.go diff --git a/client/tacacsSrc_service.go b/client/tacacsSrc_service.go new file mode 100644 index 00000000..ee1a3fb0 --- /dev/null +++ b/client/tacacsSrc_service.go @@ -0,0 +1,93 @@ +package client + +import ( + "fmt" + + "github.com/ciscoecosystem/aci-go-client/container" + "github.com/ciscoecosystem/aci-go-client/models" +) + +func (sm *ServiceManager) CreateTACACSSource(name string, monitoring_target_scope string, monitoring_policy string, tenant string, description string, nameAlias string, tacacsSrcAttr models.TACACSSourceAttributes) (*models.TACACSSource, error) { + rn := fmt.Sprintf(models.RntacacsSrc, name) + parentDn := fmt.Sprintf(models.ParentDntacacsSrc, tenant, monitoring_policy, monitoring_target_scope, monitoring_policy) + tacacsSrc := models.NewTACACSSource(rn, parentDn, description, nameAlias, tacacsSrcAttr) + err := sm.Save(tacacsSrc) + return tacacsSrc, err +} + +func (sm *ServiceManager) ReadTACACSSource(name string, monitoring_target_scope string, monitoring_policy string, tenant string) (*models.TACACSSource, error) { + dn := fmt.Sprintf(models.DntacacsSrc, tenant, monitoring_policy, monitoring_target_scope, monitoring_policy, name) + cont, err := sm.Get(dn) + if err != nil { + return nil, err + } + tacacsSrc := models.TACACSSourceFromContainer(cont) + return tacacsSrc, nil +} + +func (sm *ServiceManager) DeleteTACACSSource(name string, monitoring_target_scope string, monitoring_policy string, tenant string) error { + dn := fmt.Sprintf(models.DntacacsSrc, tenant, monitoring_policy, monitoring_target_scope, monitoring_policy, name) + return sm.DeleteByDn(dn, models.TacacssrcClassName) +} + +func (sm *ServiceManager) UpdateTACACSSource(name string, monitoring_target_scope string, monitoring_policy string, tenant string, description string, nameAlias string, tacacsSrcAttr models.TACACSSourceAttributes) (*models.TACACSSource, error) { + rn := fmt.Sprintf(models.RntacacsSrc, name) + parentDn := fmt.Sprintf(models.ParentDntacacsSrc, tenant, monitoring_policy, monitoring_target_scope, monitoring_policy) + tacacsSrc := models.NewTACACSSource(rn, parentDn, description, nameAlias, tacacsSrcAttr) + tacacsSrc.Status = "modified" + err := sm.Save(tacacsSrc) + return tacacsSrc, err +} + +func (sm *ServiceManager) ListTACACSSource(monitoring_target_scope string, monitoring_policy string, tenant string) ([]*models.TACACSSource, error) { + dnUrl := fmt.Sprintf("%s/uni/tn-%s/monepg-%s/tarepg-%s/tacacsSrc.json", models.BaseurlStr, tenant, monitoring_policy, monitoring_target_scope, monitoring_policy) + cont, err := sm.GetViaURL(dnUrl) + list := models.TACACSSourceListFromContainer(cont) + return list, err +} + +func (sm *ServiceManager) CreateRelationtacacsRsDestGroup(parentDn, annotation, tDn string) error { + dn := fmt.Sprintf("%s/rsdestGroup", parentDn) + containerJSON := []byte(fmt.Sprintf(`{ + "%s": { + "attributes": { + "dn": "%s", + "annotation": "%s", + "tDn": "%s" + } + } + }`, "tacacsRsDestGroup", dn, annotation, tDn)) + + jsonPayload, err := container.ParseJSON(containerJSON) + if err != nil { + return err + } + req, err := sm.client.MakeRestRequest("POST", fmt.Sprintf("%s.json", sm.MOURL), jsonPayload, true) + if err != nil { + return err + } + cont, _, err := sm.client.Do(req) + if err != nil { + return err + } + fmt.Printf("%+v", cont) + return nil +} + +func (sm *ServiceManager) DeleteRelationtacacsRsDestGroup(parentDn string) error { + dn := fmt.Sprintf("%s/rsdestGroup", parentDn) + return sm.DeleteByDn(dn, "tacacsRsDestGroup") +} + +func (sm *ServiceManager) ReadRelationtacacsRsDestGroup(parentDn string) (interface{}, error) { + dnUrl := fmt.Sprintf("%s/%s/%s.json", models.BaseurlStr, parentDn, "tacacsRsDestGroup") + cont, err := sm.GetViaURL(dnUrl) + contList := models.ListFromContainer(cont, "tacacsRsDestGroup") + + if len(contList) > 0 { + dat := models.G(contList[0], "tDn") + return dat, err + } else { + return nil, err + } +} diff --git a/models/tacacs_src.go b/models/tacacs_src.go new file mode 100644 index 00000000..88c8e57d --- /dev/null +++ b/models/tacacs_src.go @@ -0,0 +1,99 @@ +package models + +import ( + "fmt" + "strconv" + + "github.com/ciscoecosystem/aci-go-client/container" +) + +const ( + DntacacsSrc = "uni/tn-%s/monepg-%s/tarepg-%s/tacacssrc-%s" + RntacacsSrc = "tacacssrc-%s" + ParentDntacacsSrc = "uni/tn-%s/monepg-%s/tarepg-%s" + TacacssrcClassName = "tacacsSrc" +) + +type TACACSSource struct { + BaseAttributes + NameAliasAttribute + TACACSSourceAttributes +} + +type TACACSSourceAttributes struct { + Annotation string `json:",omitempty"` + Incl string `json:",omitempty"` + MinSev string `json:",omitempty"` + Name string `json:",omitempty"` +} + +func NewTACACSSource(tacacsSrcRn, parentDn, description, nameAlias string, tacacsSrcAttr TACACSSourceAttributes) *TACACSSource { + dn := fmt.Sprintf("%s/%s", parentDn, tacacsSrcRn) + return &TACACSSource{ + BaseAttributes: BaseAttributes{ + DistinguishedName: dn, + Description: description, + Status: "created, modified", + ClassName: TacacssrcClassName, + Rn: tacacsSrcRn, + }, + NameAliasAttribute: NameAliasAttribute{ + NameAlias: nameAlias, + }, + TACACSSourceAttributes: tacacsSrcAttr, + } +} + +func (tacacsSrc *TACACSSource) ToMap() (map[string]string, error) { + tacacsSrcMap, err := tacacsSrc.BaseAttributes.ToMap() + if err != nil { + return nil, err + } + alias, err := tacacsSrc.NameAliasAttribute.ToMap() + if err != nil { + return nil, err + } + for key, value := range alias { + A(tacacsSrcMap, key, value) + } + A(tacacsSrcMap, "annotation", tacacsSrc.Annotation) + A(tacacsSrcMap, "incl", tacacsSrc.Incl) + A(tacacsSrcMap, "minSev", tacacsSrc.MinSev) + A(tacacsSrcMap, "name", tacacsSrc.Name) + return tacacsSrcMap, err +} + +func TACACSSourceFromContainerList(cont *container.Container, index int) *TACACSSource { + TACACSSourceCont := cont.S("imdata").Index(index).S(TacacssrcClassName, "attributes") + return &TACACSSource{ + BaseAttributes{ + DistinguishedName: G(TACACSSourceCont, "dn"), + Description: G(TACACSSourceCont, "descr"), + Status: G(TACACSSourceCont, "status"), + ClassName: TacacssrcClassName, + Rn: G(TACACSSourceCont, "rn"), + }, + NameAliasAttribute{ + NameAlias: G(TACACSSourceCont, "nameAlias"), + }, + TACACSSourceAttributes{ + Annotation: G(TACACSSourceCont, "annotation"), + Incl: G(TACACSSourceCont, "incl"), + MinSev: G(TACACSSourceCont, "minSev"), + Name: G(TACACSSourceCont, "name"), + }, + } +} + +func TACACSSourceFromContainer(cont *container.Container) *TACACSSource { + return TACACSSourceFromContainerList(cont, 0) +} + +func TACACSSourceListFromContainer(cont *container.Container) []*TACACSSource { + length, _ := strconv.Atoi(G(cont, "totalCount")) + arr := make([]*TACACSSource, length) + for i := 0; i < length; i++ { + arr[i] = TACACSSourceFromContainerList(cont, i) + } + return arr +}