github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/gtm/resource.go (about) 1 package gtm 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 ) 8 9 // Resources contains operations available on a Resource resource. 10 type Resources interface { 11 // ListResources retrieves all Resources 12 // 13 // See: https://techdocs.akamai.com/gtm/reference/get-resources 14 ListResources(context.Context, string) ([]*Resource, error) 15 // GetResource retrieves a Resource with the given name. 16 // 17 // See: https://techdocs.akamai.com/gtm/reference/get-resource 18 GetResource(context.Context, string, string) (*Resource, error) 19 // CreateResource creates the datacenter identified by the receiver argument in the specified domain. 20 // 21 // See: https://techdocs.akamai.com/gtm/reference/put-resource 22 CreateResource(context.Context, *Resource, string) (*ResourceResponse, error) 23 // DeleteResource deletes the datacenter identified by the receiver argument from the domain specified. 24 // 25 // See: https://techdocs.akamai.com/gtm/reference/delete-resource 26 DeleteResource(context.Context, *Resource, string) (*ResponseStatus, error) 27 // UpdateResource updates the datacenter identified in the receiver argument in the provided domain. 28 // 29 // See: https://techdocs.akamai.com/gtm/reference/put-resource 30 UpdateResource(context.Context, *Resource, string) (*ResponseStatus, error) 31 } 32 33 // ResourceInstance contains information about the resources that constrain the properties within the data center 34 type ResourceInstance struct { 35 DatacenterID int `json:"datacenterId"` 36 UseDefaultLoadObject bool `json:"useDefaultLoadObject"` 37 LoadObject 38 } 39 40 // Resource represents a GTM resource 41 type Resource struct { 42 Type string `json:"type"` 43 HostHeader string `json:"hostHeader,omitempty"` 44 LeastSquaresDecay float64 `json:"leastSquaresDecay,omitempty"` 45 Description string `json:"description,omitempty"` 46 LeaderString string `json:"leaderString,omitempty"` 47 ConstrainedProperty string `json:"constrainedProperty,omitempty"` 48 ResourceInstances []*ResourceInstance `json:"resourceInstances,omitempty"` 49 AggregationType string `json:"aggregationType,omitempty"` 50 Links []*Link `json:"links,omitempty"` 51 LoadImbalancePercentage float64 `json:"loadImbalancePercentage,omitempty"` 52 UpperBound int `json:"upperBound,omitempty"` 53 Name string `json:"name"` 54 MaxUMultiplicativeIncrement float64 `json:"maxUMultiplicativeIncrement,omitempty"` 55 DecayRate float64 `json:"decayRate,omitempty"` 56 } 57 58 // ResourceList is the structure returned by List Resources 59 type ResourceList struct { 60 ResourceItems []*Resource `json:"items"` 61 } 62 63 // Validate validates Resource 64 func (r *Resource) Validate() error { 65 if len(r.Name) < 1 { 66 return fmt.Errorf("resource is missing Name") 67 } 68 if len(r.Type) < 1 { 69 return fmt.Errorf("resource is missing Type") 70 } 71 72 return nil 73 } 74 75 func (g *gtm) ListResources(ctx context.Context, domainName string) ([]*Resource, error) { 76 logger := g.Log(ctx) 77 logger.Debug("ListResources") 78 79 getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/resources", domainName) 80 req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil) 81 if err != nil { 82 return nil, fmt.Errorf("failed to create ListResources request: %w", err) 83 } 84 setVersionHeader(req, schemaVersion) 85 86 var result ResourceList 87 resp, err := g.Exec(req, &result) 88 if err != nil { 89 return nil, fmt.Errorf("ListResources request failed: %w", err) 90 } 91 92 if resp.StatusCode != http.StatusOK { 93 return nil, g.Error(resp) 94 } 95 96 return result.ResourceItems, nil 97 } 98 99 func (g *gtm) GetResource(ctx context.Context, resourceName, domainName string) (*Resource, error) { 100 logger := g.Log(ctx) 101 logger.Debug("GetResource") 102 103 getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/resources/%s", domainName, resourceName) 104 req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil) 105 if err != nil { 106 return nil, fmt.Errorf("failed to create GetResource request: %w", err) 107 } 108 setVersionHeader(req, schemaVersion) 109 110 var result Resource 111 resp, err := g.Exec(req, &result) 112 if err != nil { 113 return nil, fmt.Errorf("GetResource request failed: %w", err) 114 } 115 116 if resp.StatusCode != http.StatusOK { 117 return nil, g.Error(resp) 118 } 119 120 return &result, nil 121 } 122 123 func (g *gtm) CreateResource(ctx context.Context, resource *Resource, domainName string) (*ResourceResponse, error) { 124 logger := g.Log(ctx) 125 logger.Debug("CreateResource") 126 127 return resource.save(ctx, g, domainName) 128 } 129 130 func (g *gtm) UpdateResource(ctx context.Context, resource *Resource, domainName string) (*ResponseStatus, error) { 131 logger := g.Log(ctx) 132 logger.Debug("UpdateResource") 133 134 stat, err := resource.save(ctx, g, domainName) 135 if err != nil { 136 return nil, err 137 } 138 return stat.Status, err 139 } 140 141 // save is a function that saves Resource in given domain. Common path for Create and Update. 142 func (r *Resource) save(ctx context.Context, g *gtm, domainName string) (*ResourceResponse, error) { 143 if err := r.Validate(); err != nil { 144 return nil, fmt.Errorf("resource validation failed. %w", err) 145 } 146 147 putURL := fmt.Sprintf("/config-gtm/v1/domains/%s/resources/%s", domainName, r.Name) 148 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 149 if err != nil { 150 return nil, fmt.Errorf("failed to create Resource request: %w", err) 151 } 152 setVersionHeader(req, schemaVersion) 153 154 var result ResourceResponse 155 resp, err := g.Exec(req, &result, r) 156 if err != nil { 157 return nil, fmt.Errorf("resource request failed: %w", err) 158 } 159 160 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 161 return nil, g.Error(resp) 162 } 163 164 return &result, nil 165 } 166 167 func (g *gtm) DeleteResource(ctx context.Context, resource *Resource, domainName string) (*ResponseStatus, error) { 168 logger := g.Log(ctx) 169 logger.Debug("DeleteResource") 170 171 if err := resource.Validate(); err != nil { 172 logger.Errorf("Resource validation failed. %w", err) 173 return nil, fmt.Errorf("DeleteResource validation failed. %w", err) 174 } 175 176 delURL := fmt.Sprintf("/config-gtm/v1/domains/%s/resources/%s", domainName, resource.Name) 177 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, delURL, nil) 178 if err != nil { 179 return nil, fmt.Errorf("failed to create Delete request: %w", err) 180 } 181 setVersionHeader(req, schemaVersion) 182 183 var result ResponseBody 184 resp, err := g.Exec(req, &result) 185 if err != nil { 186 return nil, fmt.Errorf("DeleteResource request failed: %w", err) 187 } 188 189 if resp.StatusCode != http.StatusOK { 190 return nil, g.Error(resp) 191 } 192 193 return result.Status, nil 194 }