From 710883473d7584fcef2c78104aed3e1b1de65a45 Mon Sep 17 00:00:00 2001 From: ziyeqf <51212351+ziyeqf@users.noreply.github.com> Date: Fri, 5 Jul 2024 10:56:30 +0800 Subject: [PATCH] `azurerm_sentinel_data_connector_threat_intelligence_taxii`: fix parsing error (#26316) * `azurerm_sentinel_data_connector_threat_intelligence_taxii`: fix parsing error * to retrigger CI --- .../sentinel/azuresdkhacks/dataconnectors.go | 165 ------ .../services/sentinel/azuresdkhacks/models.go | 473 ------------------ .../sentinel/sentinel_data_connector.go | 9 +- ...ata_connector_threat_intelligence_taxii.go | 24 +- ...onnector_threat_intelligence_taxii_test.go | 3 +- 5 files changed, 15 insertions(+), 659 deletions(-) delete mode 100644 internal/services/sentinel/azuresdkhacks/dataconnectors.go delete mode 100644 internal/services/sentinel/azuresdkhacks/models.go diff --git a/internal/services/sentinel/azuresdkhacks/dataconnectors.go b/internal/services/sentinel/azuresdkhacks/dataconnectors.go deleted file mode 100644 index bdc33050dbda..000000000000 --- a/internal/services/sentinel/azuresdkhacks/dataconnectors.go +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package azuresdkhacks - -import ( - "context" - "net/http" - - "github.com/Azure/go-autorest/autorest" - "github.com/Azure/go-autorest/autorest/azure" - "github.com/Azure/go-autorest/autorest/validation" - securityinsight "github.com/tombuildsstuff/kermit/sdk/securityinsights/2022-10-01-preview/securityinsights" -) - -type DataConnectorsClient struct { - securityinsight.BaseClient -} - -func (client DataConnectorsClient) Get(ctx context.Context, resourceGroupName string, workspaceName string, dataConnectorID string) (result DataConnectorModel, err error) { - if err := validation.Validate([]validation.Validation{ - {TargetValue: client.SubscriptionID, - Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}, - {TargetValue: resourceGroupName, - Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil}, - {Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil}}}, - {TargetValue: workspaceName, - Constraints: []validation.Constraint{{Target: "workspaceName", Name: validation.MaxLength, Rule: 90, Chain: nil}, - {Target: "workspaceName", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil { - return result, validation.NewError("securityinsight.DataConnectorsClient", "Get", err.Error()) - } - - req, err := client.GetPreparer(ctx, resourceGroupName, workspaceName, dataConnectorID) - if err != nil { - err = autorest.NewErrorWithError(err, "securityinsight.DataConnectorsClient", "Get", nil, "Failure preparing request") - return - } - - resp, err := client.GetSender(req) - if err != nil { - result.Response = autorest.Response{Response: resp} - err = autorest.NewErrorWithError(err, "securityinsight.DataConnectorsClient", "Get", resp, "Failure sending request") - return - } - - result, err = client.GetResponder(resp) - if err != nil { - err = autorest.NewErrorWithError(err, "securityinsight.DataConnectorsClient", "Get", resp, "Failure responding to request") - return - } - - return -} - -func (client DataConnectorsClient) GetPreparer(ctx context.Context, resourceGroupName string, workspaceName string, dataConnectorID string) (*http.Request, error) { - pathParameters := map[string]interface{}{ - "dataConnectorId": autorest.Encode("path", dataConnectorID), - "resourceGroupName": autorest.Encode("path", resourceGroupName), - "subscriptionId": autorest.Encode("path", client.SubscriptionID), - "workspaceName": autorest.Encode("path", workspaceName), - } - - const APIVersion = "2022-10-01-preview" - queryParameters := map[string]interface{}{ - "api-version": APIVersion, - } - - preparer := autorest.CreatePreparer( - autorest.AsGet(), - autorest.WithBaseURL(client.BaseURI), - autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}/providers/Microsoft.SecurityInsights/dataConnectors/{dataConnectorId}", pathParameters), - autorest.WithQueryParameters(queryParameters)) - return preparer.Prepare((&http.Request{}).WithContext(ctx)) -} - -func (client DataConnectorsClient) GetSender(req *http.Request) (*http.Response, error) { - return client.Send(req, azure.DoRetryWithRegistration(client.Client)) -} - -func (client DataConnectorsClient) GetResponder(resp *http.Response) (result DataConnectorModel, err error) { - err = autorest.Respond( - resp, - azure.WithErrorUnlessStatusCode(http.StatusOK), - autorest.ByUnmarshallingJSON(&result), - autorest.ByClosing()) - result.Response = autorest.Response{Response: resp} - return -} - -func (client DataConnectorsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, workspaceName string, dataConnectorID string, dataConnector securityinsight.BasicDataConnector) (result DataConnectorModel, err error) { - if err := validation.Validate([]validation.Validation{ - {TargetValue: client.SubscriptionID, - Constraints: []validation.Constraint{{Target: "client.SubscriptionID", Name: validation.MinLength, Rule: 1, Chain: nil}}}, - {TargetValue: resourceGroupName, - Constraints: []validation.Constraint{{Target: "resourceGroupName", Name: validation.MaxLength, Rule: 90, Chain: nil}, - {Target: "resourceGroupName", Name: validation.MinLength, Rule: 1, Chain: nil}}}, - {TargetValue: workspaceName, - Constraints: []validation.Constraint{{Target: "workspaceName", Name: validation.MaxLength, Rule: 90, Chain: nil}, - {Target: "workspaceName", Name: validation.MinLength, Rule: 1, Chain: nil}}}}); err != nil { - return result, validation.NewError("securityinsight.DataConnectorsClient", "CreateOrUpdate", err.Error()) - } - - req, err := client.CreateOrUpdatePreparer(ctx, resourceGroupName, workspaceName, dataConnectorID, dataConnector) - if err != nil { - err = autorest.NewErrorWithError(err, "securityinsight.DataConnectorsClient", "CreateOrUpdate", nil, "Failure preparing request") - return - } - - resp, err := client.CreateOrUpdateSender(req) - if err != nil { - result.Response = autorest.Response{Response: resp} - err = autorest.NewErrorWithError(err, "securityinsight.DataConnectorsClient", "CreateOrUpdate", resp, "Failure sending request") - return - } - - result, err = client.CreateOrUpdateResponder(resp) - if err != nil { - err = autorest.NewErrorWithError(err, "securityinsight.DataConnectorsClient", "CreateOrUpdate", resp, "Failure responding to request") - return - } - - return -} - -// CreateOrUpdatePreparer prepares the CreateOrUpdate request. -func (client DataConnectorsClient) CreateOrUpdatePreparer(ctx context.Context, resourceGroupName string, workspaceName string, dataConnectorID string, dataConnector securityinsight.BasicDataConnector) (*http.Request, error) { - pathParameters := map[string]interface{}{ - "dataConnectorId": autorest.Encode("path", dataConnectorID), - "resourceGroupName": autorest.Encode("path", resourceGroupName), - "subscriptionId": autorest.Encode("path", client.SubscriptionID), - "workspaceName": autorest.Encode("path", workspaceName), - } - - const APIVersion = "2022-10-01-preview" - queryParameters := map[string]interface{}{ - "api-version": APIVersion, - } - - preparer := autorest.CreatePreparer( - autorest.AsContentType("application/json; charset=utf-8"), - autorest.AsPut(), - autorest.WithBaseURL(client.BaseURI), - autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}/providers/Microsoft.SecurityInsights/dataConnectors/{dataConnectorId}", pathParameters), - autorest.WithJSON(dataConnector), - autorest.WithQueryParameters(queryParameters)) - return preparer.Prepare((&http.Request{}).WithContext(ctx)) -} - -// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the -// http.Response Body if it receives an error. -func (client DataConnectorsClient) CreateOrUpdateSender(req *http.Request) (*http.Response, error) { - return client.Send(req, azure.DoRetryWithRegistration(client.Client)) -} - -// CreateOrUpdateResponder handles the response to the CreateOrUpdate request. The method always -// closes the http.Response Body. -func (client DataConnectorsClient) CreateOrUpdateResponder(resp *http.Response) (result DataConnectorModel, err error) { - err = autorest.Respond( - resp, - azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated), - autorest.ByUnmarshallingJSON(&result), - autorest.ByClosing()) - result.Response = autorest.Response{Response: resp} - return -} diff --git a/internal/services/sentinel/azuresdkhacks/models.go b/internal/services/sentinel/azuresdkhacks/models.go deleted file mode 100644 index 465a99b8780f..000000000000 --- a/internal/services/sentinel/azuresdkhacks/models.go +++ /dev/null @@ -1,473 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package azuresdkhacks - -import ( - "encoding/json" - "fmt" - "time" - - "github.com/Azure/go-autorest/autorest" - "github.com/Azure/go-autorest/autorest/date" - securityinsight "github.com/tombuildsstuff/kermit/sdk/securityinsights/2022-10-01-preview/securityinsights" -) - -// TODO 4.0 check if this can be removed -// Hacking the SDK model, together with the Create and Get method for working around issue: https://github.com/Azure/azure-rest-api-specs/issues/21487 -// The left issue is `PollingFrequency` is not consistent. The API returns 0, 1, 2, but the SDK expects the string value. -// tracked on https://github.com/Azure/azure-rest-api-specs/issues/21487 - -type DataConnectorModel struct { - autorest.Response `json:"-"` - Value securityinsight.BasicDataConnector `json:"value,omitempty"` -} - -func (dcm *DataConnectorModel) UnmarshalJSON(body []byte) error { - dc, err := unmarshalBasicDataConnector(body) - if err != nil { - return err - } - dcm.Value = dc - - return nil -} - -func unmarshalBasicDataConnector(body []byte) (securityinsight.BasicDataConnector, error) { - var m map[string]interface{} - err := json.Unmarshal(body, &m) - if err != nil { - return nil, err - } - - switch m["kind"] { - case string(securityinsight.KindBasicDataConnectorKindAzureActiveDirectory): - var adc securityinsight.AADDataConnector - err := json.Unmarshal(body, &adc) - return adc, err - case string(securityinsight.KindBasicDataConnectorKindMicrosoftThreatIntelligence): - var mdc securityinsight.MSTIDataConnector - err := json.Unmarshal(body, &mdc) - return mdc, err - case string(securityinsight.KindBasicDataConnectorKindMicrosoftThreatProtection): - var mdc securityinsight.MTPDataConnector - err := json.Unmarshal(body, &mdc) - return mdc, err - case string(securityinsight.KindBasicDataConnectorKindAzureAdvancedThreatProtection): - var adc securityinsight.AATPDataConnector - err := json.Unmarshal(body, &adc) - return adc, err - case string(securityinsight.KindBasicDataConnectorKindAzureSecurityCenter): - var adc securityinsight.ASCDataConnector - err := json.Unmarshal(body, &adc) - return adc, err - case string(securityinsight.KindBasicDataConnectorKindAmazonWebServicesCloudTrail): - var actdc securityinsight.AwsCloudTrailDataConnector - err := json.Unmarshal(body, &actdc) - return actdc, err - case string(securityinsight.KindBasicDataConnectorKindAmazonWebServicesS3): - var asdc securityinsight.AwsS3DataConnector - err := json.Unmarshal(body, &asdc) - return asdc, err - case string(securityinsight.KindBasicDataConnectorKindMicrosoftCloudAppSecurity): - var mdc securityinsight.MCASDataConnector - err := json.Unmarshal(body, &mdc) - return mdc, err - case string(securityinsight.KindBasicDataConnectorKindDynamics365): - var d3dc securityinsight.Dynamics365DataConnector - err := json.Unmarshal(body, &d3dc) - return d3dc, err - case string(securityinsight.KindBasicDataConnectorKindOfficeATP): - var oadc securityinsight.OfficeATPDataConnector - err := json.Unmarshal(body, &oadc) - return oadc, err - case string(securityinsight.KindBasicDataConnectorKindOffice365Project): - var o3pdc securityinsight.Office365ProjectDataConnector - err := json.Unmarshal(body, &o3pdc) - return o3pdc, err - case string(securityinsight.KindBasicDataConnectorKindOfficePowerBI): - var opbdc securityinsight.OfficePowerBIDataConnector - err := json.Unmarshal(body, &opbdc) - return opbdc, err - case string(securityinsight.KindBasicDataConnectorKindOfficeIRM): - var oidc securityinsight.OfficeIRMDataConnector - err := json.Unmarshal(body, &oidc) - return oidc, err - case string(securityinsight.KindBasicDataConnectorKindMicrosoftDefenderAdvancedThreatProtection): - var mdc securityinsight.MDATPDataConnector - err := json.Unmarshal(body, &mdc) - return mdc, err - case string(securityinsight.KindBasicDataConnectorKindOffice365): - var odc securityinsight.OfficeDataConnector - err := json.Unmarshal(body, &odc) - return odc, err - case string(securityinsight.KindBasicDataConnectorKindThreatIntelligence): - var tdc TIDataConnector - err := json.Unmarshal(body, &tdc) - return tdc, err - case string(securityinsight.KindBasicDataConnectorKindThreatIntelligenceTaxii): - var ttdc TiTaxiiDataConnector // using the hacked one - err := json.Unmarshal(body, &ttdc) - return ttdc, err - case string(securityinsight.KindBasicDataConnectorKindIOT): - var itdc securityinsight.IoTDataConnector - err := json.Unmarshal(body, &itdc) - return itdc, err - case string(securityinsight.KindBasicDataConnectorKindGenericUI): - var cudc securityinsight.CodelessUIDataConnector - err := json.Unmarshal(body, &cudc) - return cudc, err - case string(securityinsight.KindBasicDataConnectorKindAPIPolling): - var capdc securityinsight.CodelessAPIPollingDataConnector - err := json.Unmarshal(body, &capdc) - return capdc, err - default: - var dc securityinsight.DataConnector - err := json.Unmarshal(body, &dc) - return dc, err - } -} - -var _ securityinsight.BasicDataConnector = TiTaxiiDataConnector{} - -type TiTaxiiDataConnector struct { - *TiTaxiiDataConnectorProperties `json:"properties,omitempty"` - Kind securityinsight.KindBasicDataConnector `json:"kind,omitempty"` - Etag *string `json:"etag,omitempty"` - ID *string `json:"id,omitempty"` - Name *string `json:"name,omitempty"` - Type *string `json:"type,omitempty"` - SystemData *securityinsight.SystemData `json:"systemData,omitempty"` -} - -func (t TiTaxiiDataConnector) AsAADDataConnector() (*securityinsight.AADDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsMSTIDataConnector() (*securityinsight.MSTIDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsMTPDataConnector() (*securityinsight.MTPDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsAATPDataConnector() (*securityinsight.AATPDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsASCDataConnector() (*securityinsight.ASCDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsAwsCloudTrailDataConnector() (*securityinsight.AwsCloudTrailDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsAwsS3DataConnector() (*securityinsight.AwsS3DataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsMCASDataConnector() (*securityinsight.MCASDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsDynamics365DataConnector() (*securityinsight.Dynamics365DataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsOfficeATPDataConnector() (*securityinsight.OfficeATPDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsOffice365ProjectDataConnector() (*securityinsight.Office365ProjectDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsOfficePowerBIDataConnector() (*securityinsight.OfficePowerBIDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsOfficeIRMDataConnector() (*securityinsight.OfficeIRMDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsMDATPDataConnector() (*securityinsight.MDATPDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsOfficeDataConnector() (*securityinsight.OfficeDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsTIDataConnector() (*securityinsight.TIDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsTiTaxiiDataConnector() (*securityinsight.TiTaxiiDataConnector, bool) { - // This method is not used at all, only for implementing the interface. - return nil, false -} - -func (t TiTaxiiDataConnector) AsIoTDataConnector() (*securityinsight.IoTDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsCodelessUIDataConnector() (*securityinsight.CodelessUIDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsCodelessAPIPollingDataConnector() (*securityinsight.CodelessAPIPollingDataConnector, bool) { - return nil, false -} - -func (t TiTaxiiDataConnector) AsDataConnector() (*securityinsight.DataConnector, bool) { - return nil, false -} - -func (ttdc TiTaxiiDataConnector) MarshalJSON() ([]byte, error) { - ttdc.Kind = securityinsight.KindBasicDataConnectorKindThreatIntelligenceTaxii - objectMap := make(map[string]interface{}) - if ttdc.TiTaxiiDataConnectorProperties != nil { - objectMap["properties"] = ttdc.TiTaxiiDataConnectorProperties - } - if ttdc.Kind != "" { - objectMap["kind"] = ttdc.Kind - } - if ttdc.Etag != nil { - objectMap["etag"] = ttdc.Etag - } - return json.Marshal(objectMap) -} - -func (ttdc *TiTaxiiDataConnector) UnmarshalJSON(body []byte) error { - var m map[string]*json.RawMessage - err := json.Unmarshal(body, &m) - if err != nil { - return err - } - for k, v := range m { - switch k { - case "properties": - if v != nil { - var tiTaxiiDataConnectorProperties TiTaxiiDataConnectorProperties - err = json.Unmarshal(*v, &tiTaxiiDataConnectorProperties) - if err != nil { - return err - } - ttdc.TiTaxiiDataConnectorProperties = &tiTaxiiDataConnectorProperties - } - case "kind": - if v != nil { - var kind securityinsight.KindBasicDataConnector - err = json.Unmarshal(*v, &kind) - if err != nil { - return err - } - ttdc.Kind = kind - } - case "etag": - if v != nil { - var etag string - err = json.Unmarshal(*v, &etag) - if err != nil { - return err - } - ttdc.Etag = &etag - } - case "id": - if v != nil { - var ID string - err = json.Unmarshal(*v, &ID) - if err != nil { - return err - } - ttdc.ID = &ID - } - case "name": - if v != nil { - var name string - err = json.Unmarshal(*v, &name) - if err != nil { - return err - } - ttdc.Name = &name - } - case "type": - if v != nil { - var typeVar string - err = json.Unmarshal(*v, &typeVar) - if err != nil { - return err - } - ttdc.Type = &typeVar - } - case "systemData": - if v != nil { - var systemData securityinsight.SystemData - err = json.Unmarshal(*v, &systemData) - if err != nil { - return err - } - ttdc.SystemData = &systemData - } - } - } - - return nil -} - -var _ securityinsight.BasicDataConnector = TIDataConnector{} - -type TIDataConnector struct { - *TIDataConnectorProperties `json:"properties,omitempty"` - Kind securityinsight.KindBasicDataConnector `json:"kind,omitempty"` - Etag *string `json:"etag,omitempty"` - ID *string `json:"id,omitempty"` - Name *string `json:"name,omitempty"` - Type *string `json:"type,omitempty"` - SystemData *securityinsight.SystemData `json:"systemData,omitempty"` -} - -func (TIDataConnector) AsAADDataConnector() (*securityinsight.AADDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsMSTIDataConnector() (*securityinsight.MSTIDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsMTPDataConnector() (*securityinsight.MTPDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsAATPDataConnector() (*securityinsight.AATPDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsASCDataConnector() (*securityinsight.ASCDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsAwsCloudTrailDataConnector() (*securityinsight.AwsCloudTrailDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsAwsS3DataConnector() (*securityinsight.AwsS3DataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsMCASDataConnector() (*securityinsight.MCASDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsDynamics365DataConnector() (*securityinsight.Dynamics365DataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsOfficeATPDataConnector() (*securityinsight.OfficeATPDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsOffice365ProjectDataConnector() (*securityinsight.Office365ProjectDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsOfficePowerBIDataConnector() (*securityinsight.OfficePowerBIDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsOfficeIRMDataConnector() (*securityinsight.OfficeIRMDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsMDATPDataConnector() (*securityinsight.MDATPDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsOfficeDataConnector() (*securityinsight.OfficeDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsTIDataConnector() (*securityinsight.TIDataConnector, bool) { - // This method is not used at all, only for implementing the interface. - return nil, false -} - -func (TIDataConnector) AsTiTaxiiDataConnector() (*securityinsight.TiTaxiiDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsIoTDataConnector() (*securityinsight.IoTDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsCodelessUIDataConnector() (*securityinsight.CodelessUIDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsCodelessAPIPollingDataConnector() (*securityinsight.CodelessAPIPollingDataConnector, bool) { - return nil, false -} - -func (TIDataConnector) AsDataConnector() (*securityinsight.DataConnector, bool) { - return nil, false -} - -type TIDataConnectorProperties struct { - TipLookbackPeriod *Time `json:"tipLookbackPeriod,omitempty"` - DataTypes *securityinsight.TIDataConnectorDataTypes `json:"dataTypes,omitempty"` - TenantID *string `json:"tenantId,omitempty"` -} - -type PollingFrequency string - -func (freq *PollingFrequency) UnmarshalJSON(body []byte) error { - switch string(body) { - case "0", string(PollingFrequencyOnceAMinute): - *freq = PollingFrequencyOnceAMinute - case "1", string(PollingFrequencyOnceAnHour): - *freq = PollingFrequencyOnceAnHour - case "2", string(PollingFrequencyOnceADay): - *freq = PollingFrequencyOnceADay - default: - return fmt.Errorf("unknown enum for pollingFrequency %s", string(body)) - } - return nil -} - -const ( - PollingFrequencyOnceAMinute PollingFrequency = "OnceAMinute" // API returns 0 - PollingFrequencyOnceAnHour PollingFrequency = "OnceAnHour" // API returns 1 - PollingFrequencyOnceADay PollingFrequency = "OnceADay" // API returns 2 -) - -type Time date.Time - -func (t *Time) UnmarshalJSON(data []byte) (err error) { - // Firstly, try to parse the date time via RFC3339, which is the expected format defined by Swagger. - // However, since the service issue (#21487), it currently doesn't return in this format. - // In order not to break the code once the service fix it, we keep this try at first. - layout := fmt.Sprintf(`"%s"`, time.RFC3339) - if time, err := time.Parse(layout, string(data)); err == nil { - t.Time = time - return nil - } - - // This is the format that the service returns at this moment, which is not the expected format (RFC3339). - t.Time, err = time.Parse(`"01/02/2006 15:04:05"`, string(data)) - return err -} - -type TiTaxiiDataConnectorProperties struct { - WorkspaceID *string `json:"workspaceId,omitempty"` - FriendlyName *string `json:"friendlyName,omitempty"` - TaxiiServer *string `json:"taxiiServer,omitempty"` - CollectionID *string `json:"collectionId,omitempty"` - UserName *string `json:"userName,omitempty"` - Password *string `json:"password,omitempty"` - TaxiiLookbackPeriod *Time `json:"taxiiLookbackPeriod,omitempty"` - PollingFrequency PollingFrequency `json:"pollingFrequency,omitempty"` - DataTypes *securityinsight.TiTaxiiDataConnectorDataTypes `json:"dataTypes,omitempty"` - TenantID *string `json:"tenantId,omitempty"` -} diff --git a/internal/services/sentinel/sentinel_data_connector.go b/internal/services/sentinel/sentinel_data_connector.go index 07e01de8908b..48a800298d64 100644 --- a/internal/services/sentinel/sentinel_data_connector.go +++ b/internal/services/sentinel/sentinel_data_connector.go @@ -10,7 +10,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-azurerm/internal/clients" "github.com/hashicorp/terraform-provider-azurerm/internal/sdk" - "github.com/hashicorp/terraform-provider-azurerm/internal/services/sentinel/azuresdkhacks" "github.com/hashicorp/terraform-provider-azurerm/internal/services/sentinel/parse" "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" securityinsight "github.com/tombuildsstuff/kermit/sdk/securityinsights/2022-10-01-preview/securityinsights" @@ -42,8 +41,8 @@ func importSentinelDataConnector(expectKind securityinsight.DataConnectorKind) f return err } - // client := meta.(*clients.Client).Sentinel.DataConnectorsClient // TODO - change this when https://github.com/Azure/azure-rest-api-specs/issues/21487 is resolved - client := azuresdkhacks.DataConnectorsClient{BaseClient: meta.(*clients.Client).Sentinel.DataConnectorsClient.BaseClient} + client := meta.(*clients.Client).Sentinel.DataConnectorsClient + resp, err := client.Get(ctx, id.ResourceGroup, id.WorkspaceName, id.Name) if err != nil { return fmt.Errorf("retrieving Sentinel Alert Rule %q: %+v", id, err) @@ -88,12 +87,8 @@ func assertDataConnectorKind(dc securityinsight.BasicDataConnector, expectKind s kind = securityinsight.DataConnectorKindAmazonWebServicesS3 case securityinsight.TiTaxiiDataConnector: kind = securityinsight.DataConnectorKindThreatIntelligenceTaxii - case azuresdkhacks.TiTaxiiDataConnector: - kind = securityinsight.DataConnectorKindThreatIntelligenceTaxii case securityinsight.TIDataConnector: kind = securityinsight.DataConnectorKindThreatIntelligence - case azuresdkhacks.TIDataConnector: - kind = securityinsight.DataConnectorKindThreatIntelligence } if expectKind != kind { return fmt.Errorf("Sentinel Data Connector has mismatched kind, expected: %q, got %q", expectKind, kind) diff --git a/internal/services/sentinel/sentinel_data_connector_threat_intelligence_taxii.go b/internal/services/sentinel/sentinel_data_connector_threat_intelligence_taxii.go index a289c1449e84..2a1475b3ad70 100644 --- a/internal/services/sentinel/sentinel_data_connector_threat_intelligence_taxii.go +++ b/internal/services/sentinel/sentinel_data_connector_threat_intelligence_taxii.go @@ -8,9 +8,9 @@ import ( "fmt" "time" + "github.com/Azure/go-autorest/autorest/date" "github.com/hashicorp/go-azure-sdk/resource-manager/operationalinsights/2022-10-01/workspaces" "github.com/hashicorp/terraform-provider-azurerm/internal/sdk" - "github.com/hashicorp/terraform-provider-azurerm/internal/services/sentinel/azuresdkhacks" "github.com/hashicorp/terraform-provider-azurerm/internal/services/sentinel/parse" "github.com/hashicorp/terraform-provider-azurerm/internal/services/sentinel/validate" "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" @@ -128,7 +128,7 @@ func (r DataConnectorThreatIntelligenceTAXIIResource) Create() sdk.ResourceFunc return sdk.ResourceFunc{ Timeout: 30 * time.Minute, Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error { - client := azuresdkhacks.DataConnectorsClient{BaseClient: metadata.Client.Sentinel.DataConnectorsClient.BaseClient} + client := metadata.Client.Sentinel.DataConnectorsClient wspClient := metadata.Client.LogAnalytics.WorkspaceClient var plan DataConnectorThreatIntelligenceTAXIIModel @@ -175,15 +175,15 @@ func (r DataConnectorThreatIntelligenceTAXIIResource) Create() sdk.ResourceFunc // Format is guaranteed by schema validation lookbackDate, _ := time.Parse(time.RFC3339, plan.LookbackDate) - params := azuresdkhacks.TiTaxiiDataConnector{ + params := securityinsight.TiTaxiiDataConnector{ Name: &plan.Name, - TiTaxiiDataConnectorProperties: &azuresdkhacks.TiTaxiiDataConnectorProperties{ + TiTaxiiDataConnectorProperties: &securityinsight.TiTaxiiDataConnectorProperties{ WorkspaceID: &wspId, FriendlyName: &plan.DisplayName, TaxiiServer: &plan.APIRootURL, CollectionID: &plan.CollectionID, - PollingFrequency: azuresdkhacks.PollingFrequency(plan.PollingFrequency), - TaxiiLookbackPeriod: &azuresdkhacks.Time{ + PollingFrequency: securityinsight.PollingFrequency(plan.PollingFrequency), + TaxiiLookbackPeriod: &date.Time{ Time: lookbackDate, }, DataTypes: &securityinsight.TiTaxiiDataConnectorDataTypes{ @@ -219,7 +219,7 @@ func (r DataConnectorThreatIntelligenceTAXIIResource) Read() sdk.ResourceFunc { Timeout: 5 * time.Minute, Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error { - client := azuresdkhacks.DataConnectorsClient{BaseClient: metadata.Client.Sentinel.DataConnectorsClient.BaseClient} + client := metadata.Client.Sentinel.DataConnectorsClient var state DataConnectorThreatIntelligenceTAXIIModel if err := metadata.Decode(&state); err != nil { @@ -241,7 +241,7 @@ func (r DataConnectorThreatIntelligenceTAXIIResource) Read() sdk.ResourceFunc { return fmt.Errorf("retrieving %s: %+v", id, err) } - dc, ok := existing.Value.(azuresdkhacks.TiTaxiiDataConnector) + dc, ok := existing.Value.(securityinsight.TiTaxiiDataConnector) if !ok { return fmt.Errorf("%s was not an Threat Intelligence TAXII Data Connector", id) } @@ -286,7 +286,7 @@ func (r DataConnectorThreatIntelligenceTAXIIResource) Update() sdk.ResourceFunc return sdk.ResourceFunc{ Timeout: 30 * time.Minute, Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error { - client := azuresdkhacks.DataConnectorsClient{BaseClient: metadata.Client.Sentinel.DataConnectorsClient.BaseClient} + client := metadata.Client.Sentinel.DataConnectorsClient id, err := parse.DataConnectorID(metadata.ResourceData.Id()) if err != nil { @@ -303,7 +303,7 @@ func (r DataConnectorThreatIntelligenceTAXIIResource) Update() sdk.ResourceFunc return fmt.Errorf("retrieving %s: %+v", id, err) } - dc, ok := existing.Value.(azuresdkhacks.TiTaxiiDataConnector) + dc, ok := existing.Value.(securityinsight.TiTaxiiDataConnector) if !ok { return fmt.Errorf("%s was not an Threat Intelligence TAXII Data Connector", id) } @@ -325,12 +325,12 @@ func (r DataConnectorThreatIntelligenceTAXIIResource) Update() sdk.ResourceFunc props.Password = &plan.Password } if metadata.ResourceData.HasChange("polling_frequency") { - props.PollingFrequency = azuresdkhacks.PollingFrequency(plan.PollingFrequency) + props.PollingFrequency = securityinsight.PollingFrequency(plan.PollingFrequency) } if metadata.ResourceData.HasChange("lookback_date") { // Format is guaranteed by schema validation lookbackDate, _ := time.Parse(time.RFC3339, plan.LookbackDate) - props.TaxiiLookbackPeriod = &azuresdkhacks.Time{ + props.TaxiiLookbackPeriod = &date.Time{ Time: lookbackDate, } } diff --git a/internal/services/sentinel/sentinel_data_connector_threat_intelligence_taxii_test.go b/internal/services/sentinel/sentinel_data_connector_threat_intelligence_taxii_test.go index 87250071d07f..0d64bfb279bd 100644 --- a/internal/services/sentinel/sentinel_data_connector_threat_intelligence_taxii_test.go +++ b/internal/services/sentinel/sentinel_data_connector_threat_intelligence_taxii_test.go @@ -12,7 +12,6 @@ import ( "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance" "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/check" "github.com/hashicorp/terraform-provider-azurerm/internal/clients" - "github.com/hashicorp/terraform-provider-azurerm/internal/services/sentinel/azuresdkhacks" "github.com/hashicorp/terraform-provider-azurerm/internal/services/sentinel/parse" "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" "github.com/hashicorp/terraform-provider-azurerm/utils" @@ -143,7 +142,7 @@ func TestAccDataConnectorThreatIntelligenceTAXII_requiresImport(t *testing.T) { } func (r DataConnectorThreatIntelligenceTAXIIResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { - client := azuresdkhacks.DataConnectorsClient{BaseClient: clients.Sentinel.DataConnectorsClient.BaseClient} + client := clients.Sentinel.DataConnectorsClient id, err := parse.DataConnectorID(state.ID) if err != nil {