Skip to content

Commit 380bde1

Browse files
authored
feat(monitor): ADD new cloud account creation endpoint (#565)
* ADD new cloud account creation endpoint
1 parent 6f601ca commit 380bde1

File tree

4 files changed

+326
-19
lines changed

4 files changed

+326
-19
lines changed

sysdig/internal/client/v2/cloud_account.go

+85
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ const (
1212
cloudAccountPath = "%s/api/cloud/v2/accounts/%s"
1313
cloudAccountWithExternalIDPath = "%s/api/cloud/v2/accounts/%s?includeExternalID=true"
1414
providersPath = "%v/api/v2/providers"
15+
costCloudAccountPath = "%s/api/cloudaccount"
16+
costProviderURL = "%s/api/cloudaccount/features/cost/account?id=%d"
17+
updateCostProviderURL = "%s/api/cloudaccount/features/cost"
1518
)
1619

1720
type CloudAccountSecureInterface interface {
@@ -25,8 +28,11 @@ type CloudAccountSecureInterface interface {
2528
type CloudAccountMonitorInterface interface {
2629
Base
2730
CreateCloudAccountMonitor(ctx context.Context, provider *CloudAccountMonitor) (*CloudAccountMonitor, error)
31+
CreateCloudAccountMonitorForCost(ctx context.Context, provider *CloudAccountMonitorForCost) (*CloudAccountCreatedForCost, error)
2832
UpdateCloudAccountMonitor(ctx context.Context, id int, provider *CloudAccountMonitor) (*CloudAccountMonitor, error)
33+
UpdateCloudAccountMonitorForCost(ctx context.Context, provider *CloudAccountCostProvider) (*CloudAccountCostProvider, error)
2934
GetCloudAccountMonitor(ctx context.Context, id int) (*CloudAccountMonitor, error)
35+
GetCloudAccountMonitorForCost(ctx context.Context, id int) (*CloudAccountCostProvider, error)
3036
DeleteCloudAccountMonitor(ctx context.Context, id int) error
3137
}
3238

@@ -135,6 +141,30 @@ func (client *Client) CreateCloudAccountMonitor(ctx context.Context, provider *C
135141
return &wrapper.CloudAccount, nil
136142
}
137143

144+
func (client *Client) CreateCloudAccountMonitorForCost(ctx context.Context, provider *CloudAccountMonitorForCost) (*CloudAccountCreatedForCost, error) {
145+
payload, err := Marshal(provider)
146+
if err != nil {
147+
return nil, err
148+
}
149+
150+
response, err := client.requester.Request(ctx, http.MethodPost, client.getCostProvidersURL(), payload)
151+
if err != nil {
152+
return nil, err
153+
}
154+
defer response.Body.Close()
155+
156+
if response.StatusCode != http.StatusOK {
157+
return nil, client.ErrorFromResponse(response)
158+
}
159+
160+
wrapper, err := Unmarshal[CloudAccountCreatedForCost](response.Body)
161+
if err != nil {
162+
return nil, err
163+
}
164+
165+
return &wrapper, nil
166+
}
167+
138168
func (client *Client) UpdateCloudAccountMonitor(ctx context.Context, id int, provider *CloudAccountMonitor) (*CloudAccountMonitor, error) {
139169
payload, err := Marshal(provider)
140170
if err != nil {
@@ -159,6 +189,30 @@ func (client *Client) UpdateCloudAccountMonitor(ctx context.Context, id int, pro
159189
return &wrapper.CloudAccount, nil
160190
}
161191

192+
func (client *Client) UpdateCloudAccountMonitorForCost(ctx context.Context, provider *CloudAccountCostProvider) (*CloudAccountCostProvider, error) {
193+
payload, err := Marshal(provider)
194+
if err != nil {
195+
return nil, err
196+
}
197+
198+
response, err := client.requester.Request(ctx, http.MethodPut, client.getUpdateCostProviderURL(), payload)
199+
if err != nil {
200+
return nil, err
201+
}
202+
defer response.Body.Close()
203+
204+
if response.StatusCode != http.StatusOK {
205+
return nil, client.ErrorFromResponse(response)
206+
}
207+
208+
wrapper, err := Unmarshal[CloudAccountCostProviderWrapper](response.Body)
209+
if err != nil {
210+
return nil, err
211+
}
212+
213+
return &wrapper.CloudAccountCostProvider, nil
214+
}
215+
162216
func (client *Client) GetCloudAccountMonitor(ctx context.Context, id int) (*CloudAccountMonitor, error) {
163217
response, err := client.requester.Request(ctx, http.MethodGet, client.getProviderURL(id), nil)
164218
if err != nil {
@@ -178,6 +232,25 @@ func (client *Client) GetCloudAccountMonitor(ctx context.Context, id int) (*Clou
178232
return &wrapper.CloudAccount, nil
179233
}
180234

235+
func (client *Client) GetCloudAccountMonitorForCost(ctx context.Context, id int) (*CloudAccountCostProvider, error) {
236+
response, err := client.requester.Request(ctx, http.MethodGet, client.getCostProviderURL(id), nil)
237+
if err != nil {
238+
return nil, err
239+
}
240+
defer response.Body.Close()
241+
242+
if response.StatusCode != http.StatusOK {
243+
return nil, client.ErrorFromResponse(response)
244+
}
245+
246+
wrapper, err := Unmarshal[CloudAccountCostProviderWrapper](response.Body)
247+
if err != nil {
248+
return nil, err
249+
}
250+
251+
return &wrapper.CloudAccountCostProvider, nil
252+
}
253+
181254
func (client *Client) DeleteCloudAccountMonitor(ctx context.Context, id int) error {
182255
response, err := client.requester.Request(ctx, http.MethodDelete, client.getProviderURL(id), nil)
183256
if err != nil {
@@ -199,3 +272,15 @@ func (client *Client) getProviderURL(id int) string {
199272
func (client *Client) getProvidersURL() string {
200273
return fmt.Sprintf(providersPath, client.config.url)
201274
}
275+
276+
func (client *Client) getCostProvidersURL() string {
277+
return fmt.Sprintf(costCloudAccountPath, client.config.url)
278+
}
279+
280+
func (client *Client) getCostProviderURL(id int) string {
281+
return fmt.Sprintf(costProviderURL, client.config.url, id)
282+
}
283+
284+
func (client *Client) getUpdateCostProviderURL() string {
285+
return fmt.Sprintf(updateCostProviderURL, client.config.url)
286+
}

sysdig/internal/client/v2/model.go

+56
Original file line numberDiff line numberDiff line change
@@ -939,10 +939,66 @@ type CloudAccountMonitor struct {
939939
AdditionalOptions string `json:"additionalOptions"`
940940
}
941941

942+
type CloudAccountMonitorForCost struct {
943+
Feature string `json:"feature"`
944+
Platform string `json:"platform"`
945+
Configuration CloudCostConfiguration `json:"config"`
946+
Credentials CloudAccountCredentialsMonitor `json:"credentials"`
947+
}
948+
949+
type CloudCostConfiguration struct {
950+
AthenaBucketName string `json:"athenaBucketName"`
951+
AthenaDatabaseName string `json:"athenaDatabaseName"`
952+
AthenaRegion string `json:"athenaRegion"`
953+
AthenaWorkgroup string `json:"athenaWorkgroup"`
954+
AthenaTableName string `json:"athenaTableName"`
955+
SpotPricesBucketName string `json:"spotPricesBucketName"`
956+
}
957+
958+
type CloudAccountCreatedForCost struct {
959+
Id string `json:"id"`
960+
CustomerId int `json:"customerId"`
961+
ProviderId string `json:"providerId"`
962+
Provider string `json:"provider"`
963+
SkipFetch bool `json:"skipFetch"`
964+
IntegrationType string `json:"integrationType"`
965+
CredentialsType string `json:"credentialsType"`
966+
RoleArn string `json:"roleArn"`
967+
ExternalId string `json:"externalId"`
968+
}
969+
942970
type cloudAccountWrapperMonitor struct {
943971
CloudAccount CloudAccountMonitor `json:"provider"`
944972
}
945973

974+
type CloudConfigForCost struct {
975+
AthenaProjectId string `json:"athenaProjectId"`
976+
AthenaBucketName string `json:"athenaBucketName"`
977+
AthenaRegion string `json:"athenaRegion"`
978+
AthenaDatabaseName string `json:"athenaDatabaseName"`
979+
AthenaTableName string `json:"athenaTableName"`
980+
AthenaWorkgroup string `json:"athenaWorkgroup"`
981+
SpotPricesBucketName string `json:"spotPricesBucketName"`
982+
IntegrationType string `json:"integrationType"`
983+
}
984+
985+
type CloudAccountCostProvider struct {
986+
CustomerId int `json:"customerId"`
987+
ProviderId string `json:"providerId"`
988+
Provider string `json:"provider"`
989+
CredentialsId string `json:"credentialsId"`
990+
Feature string `json:"feature"`
991+
Config CloudConfigForCost `json:"config"`
992+
Enabled bool `json:"enabled"`
993+
CredentialsType string `json:"credentialsType"`
994+
RoleArn string `json:"roleArn"`
995+
ExternalId string `json:"externalId"`
996+
}
997+
998+
type CloudAccountCostProviderWrapper struct {
999+
CloudAccountCostProvider CloudAccountCostProvider `json:"item"`
1000+
}
1001+
9461002
type PosturePolicyZoneMeta struct {
9471003
ID string `json:"id"`
9481004
Name string `json:"name"`

0 commit comments

Comments
 (0)