Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Supports PRIVATE_LINK networking type in mongodbatlas_stream_connection resource and data sources #2940

Merged
merged 13 commits into from
Jan 20, 2025
Prev Previous commit
clean up leftover from wrong api
oarbusi committed Jan 20, 2025
commit 9a9f60e023645547926d92ba4e4dfd33f98acfd9
Original file line number Diff line number Diff line change
@@ -46,7 +46,7 @@ func (d *streamConnectionDS) Read(ctx context.Context, req datasource.ReadReques
return
}

newStreamConnectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, nil, nil, apiResp)
newStreamConnectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, nil, apiResp)
if diags.HasError() {
resp.Diagnostics.Append(diags...)
return
18 changes: 3 additions & 15 deletions internal/service/streamconnection/model_stream_connection.go
Original file line number Diff line number Diff line change
@@ -80,7 +80,7 @@ func NewStreamConnectionReq(ctx context.Context, plan *TFStreamConnectionModel)
return &streamConnection, nil
}

func NewTFStreamConnection(ctx context.Context, projID, instanceName string, currAuthConfig, currNetworkingConfig *types.Object, apiResp *admin.StreamsConnection) (*TFStreamConnectionModel, diag.Diagnostics) {
func NewTFStreamConnection(ctx context.Context, projID, instanceName string, currAuthConfig *types.Object, apiResp *admin.StreamsConnection) (*TFStreamConnectionModel, diag.Diagnostics) {
rID := fmt.Sprintf("%s-%s-%s", instanceName, projID, conversion.SafeString(apiResp.Name))
connectionModel := TFStreamConnectionModel{
ID: types.StringValue(rID),
@@ -133,21 +133,9 @@ func NewTFStreamConnection(ctx context.Context, projID, instanceName string, cur

connectionModel.Networking = types.ObjectNull(NetworkingObjectType.AttrTypes)
if apiResp.Networking != nil {
connectionID := types.StringNull()
if currNetworkingConfig != nil && !currNetworkingConfig.IsNull() && !currNetworkingConfig.IsUnknown() { // if config is available (create & update of resource) connectionID value from the config is set in new state
configNetworkingModel := &TFNetworkingModel{}
if diags := currNetworkingConfig.As(ctx, configNetworkingModel, basetypes.ObjectAsOptions{}); diags.HasError() {
return nil, diags
}
configNetworkingAccessModel := &TFNetworkingAccessModel{}
if diags := configNetworkingModel.Access.As(ctx, configNetworkingAccessModel, basetypes.ObjectAsOptions{}); diags.HasError() {
return nil, diags
}
connectionID = configNetworkingAccessModel.ConnectionID
}
networkingAccessModel, diags := types.ObjectValueFrom(ctx, NetworkingAccessObjectType.AttrTypes, TFNetworkingAccessModel{
Type: types.StringPointerValue(apiResp.Networking.Access.Type),
ConnectionID: connectionID,
ConnectionID: types.StringPointerValue(apiResp.Networking.Access.ConnectionId),
})
if diags.HasError() {
return nil, diags
@@ -197,7 +185,7 @@ func NewTFStreamConnections(ctx context.Context,
for i := range input {
projectID := streamConnectionsConfig.ProjectID.ValueString()
instanceName := streamConnectionsConfig.InstanceName.ValueString()
connectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, nil, nil, &input[i])
connectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, nil, &input[i])
if diags.HasError() {
return nil, diags
}
84 changes: 19 additions & 65 deletions internal/service/streamconnection/model_stream_connection_test.go
Original file line number Diff line number Diff line change
@@ -28,25 +28,21 @@ const (
privatelinkNetworkingType = "PRIVATE_LINK"
)

var connectionID = "connectionID"

var configMap = map[string]string{
"auto.offset.reset": "earliest",
}

type sdkToTFModelTestCase struct {
SDKResp *admin.StreamsConnection
providedProjID string
providedInstanceName string
providedAuthConfig *types.Object
providedNetworkingConfig *types.Object
expectedTFModel *streamconnection.TFStreamConnectionModel
name string
SDKResp *admin.StreamsConnection
providedProjID string
providedInstanceName string
providedAuthConfig *types.Object
expectedTFModel *streamconnection.TFStreamConnectionModel
name string
}

func TestStreamConnectionSDKToTFModel(t *testing.T) {
var authConfigWithPasswordDefined = tfAuthenticationObject(t, authMechanism, authUsername, "raw password")
var privateLinkNetworkingConfig = tfNetworkingObject(t, privatelinkNetworkingType, &connectionID)

testCases := []sdkToTFModelTestCase{
{
@@ -60,10 +56,9 @@ func TestStreamConnectionSDKToTFModel(t *testing.T) {
Type: admin.PtrString(dbRoleType),
},
},
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: nil,
providedNetworkingConfig: nil,
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: nil,
expectedTFModel: &streamconnection.TFStreamConnectionModel{
ProjectID: types.StringValue(dummyProjectID),
InstanceName: types.StringValue(instanceName),
@@ -93,10 +88,9 @@ func TestStreamConnectionSDKToTFModel(t *testing.T) {
BrokerPublicCertificate: admin.PtrString(DummyCACert),
},
},
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: &authConfigWithPasswordDefined,
providedNetworkingConfig: nil,
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: &authConfigWithPasswordDefined,
expectedTFModel: &streamconnection.TFStreamConnectionModel{
ProjectID: types.StringValue(dummyProjectID),
InstanceName: types.StringValue(instanceName),
@@ -116,10 +110,9 @@ func TestStreamConnectionSDKToTFModel(t *testing.T) {
Name: admin.PtrString(connectionName),
Type: admin.PtrString("Kafka"),
},
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: nil,
providedNetworkingConfig: nil,
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: nil,
expectedTFModel: &streamconnection.TFStreamConnectionModel{
ProjectID: types.StringValue(dummyProjectID),
InstanceName: types.StringValue(instanceName),
@@ -148,10 +141,9 @@ func TestStreamConnectionSDKToTFModel(t *testing.T) {
BrokerPublicCertificate: admin.PtrString(DummyCACert),
},
},
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: nil,
providedNetworkingConfig: nil,
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: nil,
expectedTFModel: &streamconnection.TFStreamConnectionModel{
ProjectID: types.StringValue(dummyProjectID),
InstanceName: types.StringValue(instanceName),
@@ -165,44 +157,6 @@ func TestStreamConnectionSDKToTFModel(t *testing.T) {
Networking: types.ObjectNull(streamconnection.NetworkingObjectType.AttrTypes),
},
},
{
name: "Kafka connection type SDK response with Private link networking config",
SDKResp: &admin.StreamsConnection{
Name: admin.PtrString(connectionName),
Type: admin.PtrString("Kafka"),
Authentication: &admin.StreamsKafkaAuthentication{
Mechanism: admin.PtrString(authMechanism),
Username: admin.PtrString(authUsername),
},
BootstrapServers: admin.PtrString(bootstrapServers),
Config: &configMap,
Security: &admin.StreamsKafkaSecurity{
Protocol: admin.PtrString(securityProtocol),
BrokerPublicCertificate: admin.PtrString(DummyCACert),
},
Networking: &admin.StreamsKafkaNetworking{
Access: &admin.StreamsKafkaNetworkingAccess{
Type: admin.PtrString(privatelinkNetworkingType),
},
},
},
providedProjID: dummyProjectID,
providedInstanceName: instanceName,
providedAuthConfig: nil,
providedNetworkingConfig: &privateLinkNetworkingConfig,
expectedTFModel: &streamconnection.TFStreamConnectionModel{
ProjectID: types.StringValue(dummyProjectID),
InstanceName: types.StringValue(instanceName),
ConnectionName: types.StringValue(connectionName),
Type: types.StringValue("Kafka"),
Authentication: tfAuthenticationObjectWithNoPassword(t, authMechanism, authUsername),
BootstrapServers: types.StringValue(bootstrapServers),
Config: tfConfigMap(t, configMap),
Security: tfSecurityObject(t, DummyCACert, securityProtocol),
DBRoleToExecute: types.ObjectNull(streamconnection.DBRoleToExecuteObjectType.AttrTypes),
Networking: tfNetworkingObject(t, privatelinkNetworkingType, &connectionID),
},
},
{
name: "Sample connection type sample_stream_solar sample",
SDKResp: &admin.StreamsConnection{
@@ -227,7 +181,7 @@ func TestStreamConnectionSDKToTFModel(t *testing.T) {

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
resultModel, diags := streamconnection.NewTFStreamConnection(context.Background(), tc.providedProjID, tc.providedInstanceName, tc.providedAuthConfig, tc.providedNetworkingConfig, tc.SDKResp)
resultModel, diags := streamconnection.NewTFStreamConnection(context.Background(), tc.providedProjID, tc.providedInstanceName, tc.providedAuthConfig, tc.SDKResp)
if diags.HasError() {
t.Fatalf("unexpected errors found: %s", diags.Errors()[0].Summary())
}
Original file line number Diff line number Diff line change
@@ -124,7 +124,7 @@ func (r *streamConnectionRS) Create(ctx context.Context, req resource.CreateRequ
return
}

newStreamConnectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, &streamConnectionPlan.Authentication, &streamConnectionPlan.Networking, apiResp)
newStreamConnectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, &streamConnectionPlan.Authentication, apiResp)
if diags.HasError() {
resp.Diagnostics.Append(diags...)
return
@@ -153,7 +153,7 @@ func (r *streamConnectionRS) Read(ctx context.Context, req resource.ReadRequest,
return
}

newStreamConnectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, &streamConnectionState.Authentication, &streamConnectionState.Networking, apiResp)
newStreamConnectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, &streamConnectionState.Authentication, apiResp)
if diags.HasError() {
resp.Diagnostics.Append(diags...)
return
@@ -183,7 +183,7 @@ func (r *streamConnectionRS) Update(ctx context.Context, req resource.UpdateRequ
return
}

newStreamConnectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, &streamConnectionPlan.Authentication, &streamConnectionPlan.Networking, apiResp)
newStreamConnectionModel, diags := NewTFStreamConnection(ctx, projectID, instanceName, &streamConnectionPlan.Authentication, apiResp)
if diags.HasError() {
resp.Diagnostics.Append(diags...)
return