You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ro...@apache.org on 2018/06/04 16:37:57 UTC
[incubator-trafficcontrol] 02/10: started adding new read method
This is an automated email from the ASF dual-hosted git repository.
rob pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-trafficcontrol.git
commit bfa8ae4aa27771b0f5967639e8b6a6258b83ccea
Author: ASchmidt <An...@comcast.com>
AuthorDate: Mon May 7 11:35:15 2018 -0600
started adding new read method
---
lib/go-tc/deliveryservice_servers.go | 62 ++++
.../servers/deliveryservicestoServer.go | 359 ---------------------
traffic_ops/traffic_ops_golang/routes.go | 3 +
3 files changed, 65 insertions(+), 359 deletions(-)
diff --git a/lib/go-tc/deliveryservice_servers.go b/lib/go-tc/deliveryservice_servers.go
index aa0ec99..85bfde9 100644
--- a/lib/go-tc/deliveryservice_servers.go
+++ b/lib/go-tc/deliveryservice_servers.go
@@ -78,3 +78,65 @@ type DssServer struct {
TypeID *int `json:"typeId" db:"server_type_id"`
UpdPending *bool `json:"updPending" db:"upd_pending"`
}
+
+// DeliveryServiceNullable - a version of the deliveryservice that allows for all fields to be null
+type DssDeliveryService struct {
+ // NOTE: the db: struct tags are used for testing to map to their equivalent database column (if there is one)
+ //
+ Active *bool `json:"active" db:"active"`
+ CacheURL *string `json:"cacheurl" db:"cacheurl"`
+ CCRDNSTTL *int `json:"ccrDnsTtl" db:"ccr_dns_ttl"`
+ CDNID *int `json:"cdnId" db:"cdn_id"`
+ CDNName *string `json:"cdnName"`
+ CheckPath *string `json:"checkPath" db:"check_path"`
+ DeepCachingType *DeepCachingType `json:"deepCachingType" db:"deep_caching_type"`
+ DisplayName *string `json:"displayName" db:"display_name"`
+ DNSBypassCNAME *string `json:"dnsBypassCname" db:"dns_bypass_cname"`
+ DNSBypassIP *string `json:"dnsBypassIp" db:"dns_bypass_ip"`
+ DNSBypassIP6 *string `json:"dnsBypassIp6" db:"dns_bypass_ip6"`
+ DNSBypassTTL *int `json:"dnsBypassTtl" db:"dns_bypass_ttl"`
+ DSCP *int `json:"dscp" db:"dscp"`
+ EdgeHeaderRewrite *string `json:"edgeHeaderRewrite" db:"edge_header_rewrite"`
+ FQPacingRate *int `json:"fqPacingRate" db:"fq_pacing_rate"`
+ GeoLimit *int `json:"geoLimit" db:"geo_limit"`
+ GeoLimitCountries *string `json:"geoLimitCountries" db:"geo_limit_countries"`
+ GeoLimitRedirectURL *string `json:"geoLimitRedirectURL" db:"geolimit_redirect_url"`
+ GeoProvider *int `json:"geoProvider" db:"geo_provider"`
+ GlobalMaxMBPS *int `json:"globalMaxMbps" db:"global_max_mbps"`
+ GlobalMaxTPS *int `json:"globalMaxTps" db:"global_max_tps"`
+ HTTPBypassFQDN *string `json:"httpBypassFqdn" db:"http_bypass_fqdn"`
+ ID *int `json:"id" db:"id"`
+ InfoURL *string `json:"infoUrl" db:"info_url"`
+ InitialDispersion *int `json:"initialDispersion" db:"initial_dispersion"`
+ IPV6RoutingEnabled *bool `json:"ipv6RoutingEnabled" db:"ipv6_routing_enabled"`
+ LastUpdated *TimeNoMod `json:"lastUpdated" db:"last_updated"`
+ LogsEnabled *bool `json:"logsEnabled" db:"logs_enabled"`
+ LongDesc *string `json:"longDesc" db:"long_desc"`
+ LongDesc1 *string `json:"longDesc1" db:"long_desc_1"`
+ LongDesc2 *string `json:"longDesc2" db:"long_desc_2"`
+ MaxDNSAnswers *int `json:"maxDnsAnswers" db:"max_dns_answers"`
+ MidHeaderRewrite *string `json:"midHeaderRewrite" db:"mid_header_rewrite"`
+ MissLat *float64 `json:"missLat" db:"miss_lat"`
+ MissLong *float64 `json:"missLong" db:"miss_long"`
+ MultiSiteOrigin *bool `json:"multiSiteOrigin" db:"multi_site_origin"`
+ OriginShield *string `json:"originShield" db:"origin_shield"`
+ OrgServerFQDN *string `json:"orgServerFqdn" db:"org_server_fqdn"`
+ ProfileDesc *string `json:"profileDescription"`
+ ProfileID *int `json:"profileId" db:"profile"`
+ ProfileName *string `json:"profileName"`
+ Protocol *int `json:"protocol" db:"protocol"`
+ QStringIgnore *int `json:"qstringIgnore" db:"qstring_ignore"`
+ RangeRequestHandling *int `json:"rangeRequestHandling" db:"range_request_handling"`
+ RegexRemap *string `json:"regexRemap" db:"regex_remap"`
+ RegionalGeoBlocking *bool `json:"regionalGeoBlocking" db:"regional_geo_blocking"`
+ RemapText *string `json:"remapText" db:"remap_text"`
+ RoutingName *string `json:"routingName" db:"routing_name"`
+ SigningAlgorithm *string `json:"signingAlgorithm" db:"signing_algorithm"`
+ SSLKeyVersion *int `json:"sslKeyVersion" db:"ssl_key_version"`
+ TRRequestHeaders *string `json:"trRequestHeaders" db:"tr_request_headers"`
+ TRResponseHeaders *string `json:"trResponseHeaders" db:"tr_response_headers"`
+ TenantID *int `json:"tenantId" db:"tenant_id"`
+ TypeName *string `json:"typeName"`
+ TypeID *int `json:"typeId" db:"type"`
+ XMLID *string `json:"xmlId" db:"xml_id"`
+}
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/servers/deliveryservicestoServer.go b/traffic_ops/traffic_ops_golang/deliveryservice/servers/deliveryservicestoServer.go
deleted file mode 100644
index 768dab0..0000000
--- a/traffic_ops/traffic_ops_golang/deliveryservice/servers/deliveryservicestoServer.go
+++ /dev/null
@@ -1,359 +0,0 @@
-package servers
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import (
- "errors"
- "fmt"
- "strconv"
-
- "github.com/apache/incubator-trafficcontrol/lib/go-log"
- "github.com/apache/incubator-trafficcontrol/lib/go-tc"
- "github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/api"
- "github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/auth"
- "github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/dbhelpers"
- "github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/tovalidate"
- "github.com/go-ozzo/ozzo-validation"
-
- "github.com/jmoiron/sqlx"
- "github.com/lib/pq"
-)
-
-// TODeliveryServiceRequest provides a type alias to define functions on
-type TODeliveryServiceServer tc.DeliveryServiceServer
-
-//the refType is passed into the handlers where a copy of its type is used to decode the json.
-var refType = TODeliveryServiceServer(tc.DeliveryServiceServer{})
-
-func GetRefType() *TODeliveryServiceServer {
- return &refType
-}
-
-/*
-# get all delivery services associated with a server (from deliveryservice_server table)
-$r->get( "/api/$version/servers/:id/deliveryservices" => [ id => qr/\d+/ ] )->over( authenticated => 1, not_ldap => 1 )->to( 'Deliveryservice#get_deliveryservices_by_serverId', namespace => $namespace );
-
-# delivery service / server assignments
-$r->post("/api/$version/deliveryservices/:xml_id/servers")->over( authenticated => 1, not_ldap => 1 )
-->to( 'Deliveryservice#assign_servers', namespace => $namespace );
-$r->delete("/api/$version/deliveryservice_server/:dsId/:serverId" => [ dsId => qr/\d+/, serverId => qr/\d+/ ] )->over( authenticated => 1, not_ldap => 1 )->to( 'DeliveryServiceServer#remove_server_from_ds', namespace => $namespace );
- # -- DELIVERYSERVICES: SERVERS
- # Supports ?orderby=key
- $r->get("/api/$version/deliveryserviceserver")->over( authenticated => 1, not_ldap => 1 )->to( 'DeliveryServiceServer#index', namespace => $namespace );
- $r->post("/api/$version/deliveryserviceserver")->over( authenticated => 1, not_ldap => 1 )->to( 'DeliveryServiceServer#assign_servers_to_ds', namespace => $namespace );
-
- {1.2, http.MethodGet, `deliveryservices/{id}/servers$`, api.ReadHandler(dsserver.GetRefType(), d.DB),auth.PrivLevelReadOnly, Authenticated, nil},
- {1.2, http.MethodGet, `deliveryservices/{id}/unassigned_servers$`, api.ReadHandler(dsserver.GetRefType(), d.DB),auth.PrivLevelReadOnly, Authenticated, nil},
- {1.2, http.MethodGet, `deliveryservices/{id}/servers/eligible$`, api.ReadHandler(dsserver.GetRefType(), d.DB),auth.PrivLevelReadOnly, Authenticated, nil},
-
-*/
-
-func (dss TODeliveryServiceServer) GetKeyFieldsInfo() []api.KeyFieldInfo {
- return []api.KeyFieldInfo{{"deliveryservice", api.GetIntKey}, {"server", api.GetIntKey}}
-}
-
-//Implementation of the Identifier, Validator interface functions
-func (dss TODeliveryServiceServer) GetKeys() (map[string]interface{}, bool) {
- if dss.DeliveryService == nil {
- return map[string]interface{}{"deliveryservice": 0}, false
- }
- if dss.Server == nil {
- return map[string]interface{}{"server": 0}, false
- }
- keys := make(map[string]interface{})
- ds_id := *dss.DeliveryService
- server_id := *dss.Server
-
- keys["deliveryservice"] = ds_id
- keys["server"] = server_id
- return keys, true
-}
-
-func (dss *TODeliveryServiceServer) GetAuditName() string {
- if dss.DeliveryService != nil {
- return strconv.Itoa(*dss.DeliveryService) + "-" + strconv.Itoa(*dss.Server)
- }
- return "unknown"
-}
-
-func (dss *TODeliveryServiceServer) GetType() string {
- return "deliveryserviceServers"
-}
-
-func (dss *TODeliveryServiceServer) SetKeys(keys map[string]interface{}) {
- ds_id, _ := keys["deliveryservice"].(int) //this utilizes the non panicking type assertion, if the thrown away ok variable is false i will be the zero of the type, 0 here.
- dss.DeliveryService = &ds_id
-
- server_id, _ := keys["server"].(int) //this utilizes the non panicking type assertion, if the thrown away ok variable is false i will be the zero of the type, 0 here.
- dss.Server = &server_id
-}
-
-// Validate fulfills the api.Validator interface
-func (dss *TODeliveryServiceServer) Validate(db *sqlx.DB) []error {
-
- errs := validation.Errors{
- "deliveryservice": validation.Validate(dss.DeliveryService, validation.Required),
- "server": validation.Validate(dss.Server, validation.Required),
- }
-
- return tovalidate.ToErrors(errs)
-}
-
-//The TODeliveryServiceServer implementation of the Creator interface
-//all implementations of Creator should use transactions and return the proper errorType
-//ParsePQUniqueConstraintError is used to determine if a profileparameter with conflicting values exists
-//if so, it will return an errorType of DataConflict and the type should be appended to the
-//generic error message returned
-//The insert sql returns the profile and lastUpdated values of the newly inserted profileparameter and have
-//to be added to the struct
-func (dss *TODeliveryServiceServer) Create(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
- rollbackTransaction := true
- tx, err := db.Beginx()
- defer func() {
- if tx == nil || !rollbackTransaction {
- return
- }
- err := tx.Rollback()
- if err != nil {
- log.Errorln(errors.New("rolling back transaction: " + err.Error()))
- }
- }()
-
- if err != nil {
- log.Error.Printf("could not begin transaction: %v", err)
- return tc.DBError, tc.SystemError
- }
- resultRows, err := tx.NamedQuery(insertQuery(), dss)
- if err != nil {
- if pqErr, ok := err.(*pq.Error); ok {
- err, eType := dbhelpers.ParsePQUniqueConstraintError(pqErr)
- if eType == tc.DataConflictError {
- return errors.New("a parameter with " + err.Error()), eType
- }
- return err, eType
- }
- log.Errorf("received non pq error: %++v from create execution", err)
- return tc.DBError, tc.SystemError
- }
- defer resultRows.Close()
-
- var ds_id int
- var server_id int
- var lastUpdated tc.TimeNoMod
- rowsAffected := 0
- for resultRows.Next() {
- rowsAffected++
- if err := resultRows.Scan(&ds_id, &server_id, &lastUpdated); err != nil {
- log.Error.Printf("could not scan dss from insert: %s\n", err)
- return tc.DBError, tc.SystemError
- }
- }
- if rowsAffected == 0 {
- err = errors.New("no deliveryServiceServer was inserted, nothing to return")
- log.Errorln(err)
- return tc.DBError, tc.SystemError
- }
- if rowsAffected > 1 {
- err = errors.New("too many ids returned from parameter insert")
- log.Errorln(err)
- return tc.DBError, tc.SystemError
- }
-
- dss.SetKeys(map[string]interface{}{"deliveryservice": ds_id, "server": server_id})
- dss.LastUpdated = &lastUpdated
- err = tx.Commit()
- if err != nil {
- log.Errorln("Could not commit transaction: ", err)
- return tc.DBError, tc.SystemError
- }
- rollbackTransaction = false
- return nil, tc.NoError
-}
-
-func insertQuery() string {
- query := `INSERT INTO deliveryservice_server (
-deliveryservice,
-server) VALUES (
-:ds_id,
-:server_id) RETURNING deliveryservice, server, last_updated`
- return query
-}
-
-func (dss *TODeliveryServiceServer) Read(db *sqlx.DB, params map[string]string, user auth.CurrentUser) ([]interface{}, []error, tc.ApiErrorType) {
- idstr, ok := params["id"]
-
- if !ok {
- log.Errorf("Deliveryservice Server Id missing")
- return nil, []error{errors.New("Deliverservice id is required.")}, tc.DataMissingError
- }
- id, err := strconv.Atoi(idstr)
-
- if err != nil {
- log.Errorf("Deliveryservice Server Id is not an integer")
- return nil, []error{errors.New("Deliverservice id is not an integer.")}, tc.SystemError
- }
-
- query := selectQuery()
- log.Debugln("Query is ", query)
-
- rows, err := db.Queryx(query, id)
- if err != nil {
- log.Errorf("Error querying DeliveryserviceServers: %v", err)
- return nil, []error{tc.DBError}, tc.SystemError
- }
- defer rows.Close()
-
- servers := []interface{}{}
- for rows.Next() {
- var s tc.DssServer
- if err = rows.StructScan(&s); err != nil {
- log.Errorf("error parsing dss rows: %v", err)
- return nil, []error{tc.DBError}, tc.SystemError
- }
- hiddenField := ""
- if user.PrivLevel < auth.PrivLevelAdmin {
- s.ILOPassword = &hiddenField
- }
- servers = append(servers, s)
- }
-
- return servers, []error{}, tc.NoError
-
-}
-
-//The Parameter implementation of the Deleter interface
-//all implementations of Deleter should use transactions and return the proper errorType
-func (dss *TODeliveryServiceServer) Delete(db *sqlx.DB, user auth.CurrentUser) (error, tc.ApiErrorType) {
- rollbackTransaction := true
- tx, err := db.Beginx()
- defer func() {
- if tx == nil || !rollbackTransaction {
- return
- }
- err := tx.Rollback()
- if err != nil {
- log.Errorln(errors.New("rolling back transaction: " + err.Error()))
- }
- }()
-
- if err != nil {
- log.Error.Printf("could not begin transaction: %v", err)
- return tc.DBError, tc.SystemError
- }
- log.Debugf("about to run exec query: %s with parameter: %++v", deleteQuery(), dss)
- result, err := tx.NamedExec(deleteQuery(), dss)
- if err != nil {
- log.Errorf("received error: %++v from delete execution", err)
- return tc.DBError, tc.SystemError
- }
- rowsAffected, err := result.RowsAffected()
- if err != nil {
- return tc.DBError, tc.SystemError
- }
- if rowsAffected < 1 {
- return errors.New("no parameter with that id found"), tc.DataMissingError
- }
- if rowsAffected > 1 {
- return fmt.Errorf("this create affected too many rows: %d", rowsAffected), tc.SystemError
- }
-
- err = tx.Commit()
- if err != nil {
- log.Errorln("Could not commit transaction: ", err)
- return tc.DBError, tc.SystemError
- }
- rollbackTransaction = false
- return nil, tc.NoError
-}
-func selectQuery() string {
-
- const JumboFrameBPS = 9000
-
- // COALESCE is needed to default values that are nil in the database
- // because Go does not allow that to marshal into the struct
- selectStmt := `SELECT
- cg.name as cachegroup,
- s.cachegroup as cachegroup_id,
- s.cdn_id,
- cdn.name as cdn_name,
- s.domain_name,
- s.guid,
- s.host_name,
- s.https_port,
- s.id,
- s.ilo_ip_address,
- s.ilo_ip_gateway,
- s.ilo_ip_netmask,
- s.ilo_password,
- s.ilo_username,
- COALESCE(s.interface_mtu, ` + strconv.Itoa(JumboFrameBPS) + `) as interface_mtu,
- s.interface_name,
- s.ip6_address,
- s.ip6_gateway,
- s.ip_address,
- s.ip_gateway,
- s.ip_netmask,
- s.last_updated,
- s.mgmt_ip_address,
- s.mgmt_ip_gateway,
- s.mgmt_ip_netmask,
- s.offline_reason,
- pl.name as phys_location,
- s.phys_location as phys_location_id,
- p.name as profile,
- p.description as profile_desc,
- s.profile as profile_id,
- s.rack,
- s.router_host_name,
- s.router_port_name,
- st.name as status,
- s.status as status_id,
- s.tcp_port,
- t.name as server_type,
- s.type as server_type_id,
- s.upd_pending as upd_pending
- FROM server s
- JOIN cachegroup cg ON s.cachegroup = cg.id
- JOIN cdn cdn ON s.cdn_id = cdn.id
- JOIN phys_location pl ON s.phys_location = pl.id
- JOIN profile p ON s.profile = p.id
- JOIN status st ON s.status = st.id
- JOIN type t ON s.type = t.id
- WHERE s.id in (select server from deliveryservice_server where deliveryservice = $1)`
-
- return selectStmt
-}
-
-func updateQuery() string {
- query := `UPDATE
- profile_parameter SET
- profile=:profile_id,
- parameter=:parameter_id
- WHERE profile=:profile_id AND
- parameter = :parameter_id
- RETURNING last_updated`
- return query
-}
-
-func deleteQuery() string {
- query := `DELETE FROM profile_parameter
- WHERE profile=:profile_id and parameter=:parameter_id`
- return query
-}
diff --git a/traffic_ops/traffic_ops_golang/routes.go b/traffic_ops/traffic_ops_golang/routes.go
index ebe3ca3..e6efb81 100644
--- a/traffic_ops/traffic_ops_golang/routes.go
+++ b/traffic_ops/traffic_ops_golang/routes.go
@@ -164,6 +164,9 @@ func Routes(d ServerData) ([]Route, []RawRoute, http.Handler, error) {
// get all edge servers associated with a delivery service (from deliveryservice_server table)
{1.1, http.MethodGet, `deliveryservices/{id}/servers$`, api.ReadHandler(dsserver.GetRefType(), d.DB), auth.PrivLevelReadOnly, Authenticated, nil},
+ {1.1, http.MethodGet, `servers/{id}/deliveryservices$`, api.ReadHandler(serverdss.GetRefType(), d.DB),auth.PrivLevelReadOnly, Authenticated, nil},
+ {1.1, http.MethodGet, `deliveryservices/{id}/unassigned_servers$`, api.ReadHandler(dsserver.GetRefType(), d.DB),auth.PrivLevelReadOnly, Authenticated, nil},
+ //{1.1, http.MethodGet, `deliveryservices/{id}/servers/eligible$`, api.ReadHandler(dsserver.GetRefType(), d.DB),auth.PrivLevelReadOnly, Authenticated, nil},
//Server
{1.1, http.MethodGet, `servers/checks$`, handlerToFunc(proxyHandler), 0, NoAuth, []Middleware{}},
--
To stop receiving notification emails like this one, please contact
rob@apache.org.