package migrationAPI import ( "errors" "fmt" "net/http" "net/url" "strconv" ) // AuditAccountInMultipleMG runs an audit looking for devices in the same account/env in multiple move groups // // https://migration.nsi.rackspace.com/docs/#/Audits/auditAccountMGConflict func (c *Client) AuditAccountInMultipleMG(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) uri := fmt.Sprintf("/audit/account_mg_conflict/%s", url.PathEscape(collection)) req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditColoTrunks runs an audit returning any colocation devices with trunk ports // // https://migration.nsi.rackspace.com/docs/#/Audits/auditColoTrunks func (c *Client) AuditColoTrunks(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) if opts.Device == nil && opts.MoveGroup == nil { return nil, errors.New("must set one option value: Device or MoveGroup") } uri := fmt.Sprintf("/audit/colo_trunks/%s/", url.PathEscape(collection)) if opts.Account != nil { uri = uri + "device/" + url.PathEscape(strconv.Itoa(*opts.Device)) } else { uri = uri + "move_group/" + url.PathEscape(*opts.MoveGroup) } req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditDevicesMissingFromDB will check existing environments and report active devices // that are in EM but not our DB // // https://migration.nsi.rackspace.com/docs/#/Audits/auditMissingDevice func (c *Client) AuditDevicesMissingFromDB(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) uri := fmt.Sprintf("/audit/devices_not_in_env/%s", url.PathEscape(collection)) req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditEnvInMultipleZones will audit for environment vlans that have multiple destination network zones // // https://migration.nsi.rackspace.com/docs/#/Audits/auditPublicZoneIncest func (c *Client) AuditEnvInMultipleZones(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) uri := fmt.Sprintf("/audit/public_zone/incest/%s", url.PathEscape(collection)) req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditLinkedDevices will audit for actives devices in the linked CMDB that are missing from the mig DB // // https://migration.nsi.rackspace.com/docs/#/Audits/auditLinkedDevicesMissing func (c *Client) AuditLinkedDevices(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) uri := fmt.Sprintf("/audit/linked_devices_missing/%s", url.PathEscape(collection)) req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditMigrationIPs will audit migration IP assignments for issues // // https://migration.nsi.rackspace.com/docs/#/Audits/alertMigrationIPs func (c *Client) AuditMigrationIPs(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) if opts.Account == nil && opts.MoveGroup == nil && opts.Variance == nil { return nil, errors.New("must set one option value: Account, MoveGroup, or Variance") } uri := fmt.Sprintf("/audit/migration_ips/%s/", url.PathEscape(collection)) if opts.Account != nil { uri = uri + "account/" + url.PathEscape(strconv.Itoa(*opts.Account)) } else if opts.MoveGroup != nil { uri = uri + "move_group/" + url.PathEscape(*opts.MoveGroup) } else { uri = uri + "variance/" + url.PathEscape(*opts.Variance) } req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditMigrationPorts will audit migration location assignments for potential problems // // https://migration.nsi.rackspace.com/docs/#/Audits/auditMigrationPorts func (c *Client) AuditMigrationPorts(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) if opts.Account == nil && opts.MoveGroup == nil && opts.Variance == nil && opts.Zone == nil { return nil, errors.New("must set one option value: Account, MoveGroup, Variance, or Zone") } uri := fmt.Sprintf("/audit/migration_ports/%s/", url.PathEscape(collection)) if opts.Account != nil { uri = uri + "account/" + url.PathEscape(strconv.Itoa(*opts.Account)) } else if opts.MoveGroup != nil { uri = uri + "move_group/" + url.PathEscape(*opts.MoveGroup) } else if opts.Variance != nil { uri = uri + "variance/" + url.PathEscape(*opts.Variance) } else { uri = uri + "zone/" + url.PathEscape(*opts.Zone) } req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditMigrationPortConfigs (aka, "validate") will audit migration port configurations for incorrect config // // https://migration.nsi.rackspace.com/docs/#/Audits/auditPortConfig func (c *Client) AuditMigrationPortConfigs(collection string, device int, options ...*Options) (*AuditResponse, error) { uri := fmt.Sprintf( "/audit/migration_port_configs/%s/device/%s", url.PathEscape(collection), url.PathEscape(strconv.Itoa(device)), ) opts := processOptions(options...) req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditNetworkArchitect will audit network architect for missing/incorrect data // // https://migration.nsi.rackspace.com/docs/#/Audits/auditNetworkArchitect func (c *Client) AuditNetworkArchitect(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) if opts.Account == nil && opts.MoveGroup == nil && opts.Variance == nil && opts.Zone == nil { return nil, errors.New("must set one option value: Account, MoveGroup, Variance, or Zone") } uri := fmt.Sprintf("/audit/network_architect/%s", url.PathEscape(collection)) if opts.Account != nil { uri = uri + "/account/" + url.PathEscape(strconv.Itoa(*opts.Account)) } else if opts.MoveGroup != nil { uri = uri + "/move_group/" + url.PathEscape(*opts.MoveGroup) } else if opts.Variance != nil { uri = uri + "/variance/" + url.PathEscape(*opts.Variance) } else { uri = uri + "/zone/" + url.PathEscape(*opts.Zone) } req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) } // AuditNoEnvironment will audit for devices that are missing an environment number // // https://migration.nsi.rackspace.com/docs/#/Audits/auditMissingEnvironment func (c *Client) AuditNoEnvironment(collection string, options ...*Options) (*AuditResponse, error) { opts := processOptions(options...) uri := fmt.Sprintf("/audit/no_environment/%s", url.PathEscape(collection)) if opts.MoveGroup != nil { uri = uri + "/move_group/" + url.PathEscape(*opts.MoveGroup) } else if opts.Variance != nil { uri = uri + "/variance/" + url.PathEscape(*opts.Variance) } req, err := c.newRequest(c.URL+uri, http.MethodGet, nil, opts) if err != nil { return nil, err } resp := new(AuditResponse) return resp, c.do(req, resp, opts) }