Skip to content

Commit 94d2a9a

Browse files
loafoeakodhawan
andauthored
Add resource for managing HSDP Connect IoT provisioning organization configs (#481)
* Add resource for managing HSDP Connect IoT provisioning organization configurations * Add data source for Connect IoT Provisioning organization configuration with tests * Update go-dip-api to v0.93.1 Signed-off-by: Andy Lo-A-Foe <andy.loafoe@gmail.com> Co-authored-by: Akhil Dhawan <akhil.dhawan@philips.com>
1 parent 11c2cac commit 94d2a9a

8 files changed

+790
-56
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
subcategory: "Connect IoT"
3+
---
4+
5+
# Data Source: hsdp_connect_iot_provisioning_orgconfiguration
6+
7+
Retrieves an existing Connect IoT Provisioning organization configuration.
8+
9+
## Example Usage
10+
11+
```hcl
12+
data "hsdp_connect_iot_provisioning_orgconfiguration" "myconfig" {
13+
organization_guid = var.organization_guid
14+
}
15+
16+
output "public_key" {
17+
value = data.hsdp_connect_iot_provisioning_orgconfiguration.myconfig.public_key
18+
}
19+
```
20+
21+
## Argument Reference
22+
23+
The following arguments are required:
24+
25+
* `organization_guid` - (Required) The organization GUID to look up.
26+
27+
## Attribute Reference
28+
29+
In addition to all arguments above, the following attributes are exported:
30+
31+
* `id` - The ID of the organization configuration.
32+
* `service_account` - Service account configuration block containing:
33+
* `client_id` - The service account client ID.
34+
* `service_account_key` - (Sensitive) The service account key.
35+
* `token_url` - The token URL for the service account.
36+
* `bootstrap_signature` - Bootstrap signature configuration block containing:
37+
* `algorithm` - The signing algorithm used.
38+
* `public_key` - The public key for signature verification.
39+
* `salt_length` - The salt length for the signature.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# hsdp_connect_iot_provisioning_orgconfiguration (Resource)
2+
3+
Provides a resource for managing HSDP Connect IoT provisioning organization configurations. This resource allows you to configure the service account and bootstrap signature settings for an organization in the Connect IoT provisioning service.
4+
5+
## Example Usage
6+
7+
```terraform
8+
resource "hsdp_connect_iot_provisioning_orgconfiguration" "my-orgconfig" {
9+
organization_guid = "1ac2e233-8146-4661-8ec4-dc956aeb5a4b"
10+
11+
service_account {
12+
service_account_id = "demo_test_tf.xyz-app.xyz-prop@demo.iot__connect__sandbox.apmplatform.philips-healthsuite.com"
13+
service_account_key = "-----BEGIN RSA PRIVATE KEY-----\nMIIEowBlahBlahI1KExUm\n-----END RSA PRIVATE KEY-----"
14+
}
15+
16+
bootstrap_signature {
17+
algorithm = "RSA-SHA256"
18+
public_key = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSBlahBlahBlahMqgzQIDAQAB\n-----END PUBLIC KEY-----"
19+
20+
config {
21+
type = "RSA"
22+
padding = "RSA_PKCS1_PSS_PADDING"
23+
salt_length = "RSA_PSS_SALTLEN_MAX_SIGN"
24+
}
25+
}
26+
}
27+
```
28+
29+
## Argument Reference
30+
31+
The following arguments are supported:
32+
33+
* `organization_guid` - (Required, ForceNew) The GUID of the organization to configure.
34+
35+
* `service_account` - (Required) Service account configuration block containing:
36+
* `service_account_id` - (Required) The service account ID for the organization.
37+
* `service_account_key` - (Required, Sensitive) The service account private key.
38+
39+
* `bootstrap_signature` - (Required) Bootstrap signature configuration block containing:
40+
* `algorithm` - (Required) The signature algorithm to use (e.g., "RSA-SHA256").
41+
* `public_key` - (Required) The public key for bootstrap signature verification.
42+
* `config` - (Optional) Additional configuration block containing:
43+
* `type` - (Optional) The signature type (e.g., "RSA", "ECC", "DSA").
44+
* `padding` - (Optional) The padding type (e.g., "RSA_PKCS1_PSS_PADDING").
45+
* `salt_length` - (Optional) The salt length configuration (e.g., "RSA_PSS_SALTLEN_MAX_SIGN").
46+
47+
## Attribute Reference
48+
49+
In addition to all arguments above, the following attributes are exported:
50+
51+
* `id` - The unique identifier of the organization configuration.
52+
53+
## Import
54+
55+
Organization configurations can be imported using their ID:
56+
57+
```shell
58+
terraform import hsdp_connect_iot_provisioning_orgconfiguration.my-orgconfig <id>
59+
```

hsdp/provider.go

Lines changed: 60 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"os"
77

88
"github.com/philips-software/terraform-provider-hsdp/internal/services/connect/dbs"
9+
"github.com/philips-software/terraform-provider-hsdp/internal/services/connect/provisioning"
910

1011
"github.com/philips-software/terraform-provider-hsdp/internal/services/blr"
1112

@@ -294,6 +295,7 @@ func Provider(build string) *schema.Provider {
294295
"hsdp_connect_mdm_application": mdm.ResourceMDMApplication(),
295296
"hsdp_connect_mdm_firmware_component_version": mdm.ResourceConnectMDMFirmwareComponentVersion(),
296297
"hsdp_connect_mdm_firmware_distribution_request": mdm.ResourceConnectMDMFirmwareDistributionRequest(),
298+
"hsdp_connect_iot_provisioning_orgconfiguration": provisioning.ResourceConnectIoTProvisioningOrgConfiguration(),
297299
"hsdp_iam_group_membership": group_membership.ResourceIAMGroupMembership(),
298300
"hsdp_iam_role_sharing_policy": role_sharing_policy.ResourceRoleSharingPolicy(),
299301
"hsdp_iam_device": device.ResourceIAMDevice(),
@@ -304,62 +306,63 @@ func Provider(build string) *schema.Provider {
304306
"hsdp_tenant_key": tenant.ResourceTenantKey(),
305307
},
306308
DataSourcesMap: map[string]*schema.Resource{
307-
"hsdp_iam_introspect": iam.DataSourceIAMIntrospect(),
308-
"hsdp_iam_user": user.DataSourceUser(),
309-
"hsdp_iam_service": service.DataSourceService(),
310-
"hsdp_iam_permissions": iam.DataSourceIAMPermissions(),
311-
"hsdp_iam_org": organization.DataSourceIAMOrg(),
312-
"hsdp_iam_proposition": proposition.DataSourceIAMProposition(),
313-
"hsdp_iam_application": application.DataSourceIAMApplication(),
314-
"hsdp_s3creds_access": s3creds.DataSourceS3CredsAccess(),
315-
"hsdp_s3creds_policy": s3creds.DataSourceS3CredsPolicy(),
316-
"hsdp_config": configuration.DataSourceConfig(),
317-
"hsdp_container_host_subnet_types": ch.DataSourceContainerHostSubnetTypes(),
318-
"hsdp_pki_root": pki.DataSourcePKIRoot(),
319-
"hsdp_pki_policy": pki.DataSourcePKIPolicy(),
320-
"hsdp_edge_device": edge.DataSourceEdgeDevice(),
321-
"hsdp_notification_producers": notification.DataSourceNotificationProducers(),
322-
"hsdp_notification_producer": notification.DataSourceNotificationProducer(),
323-
"hsdp_notification_topics": notification.DataSourceNotificationTopics(),
324-
"hsdp_notification_topic": notification.DataSourceNotificationTopic(),
325-
"hsdp_notification_subscription": notification.DataSourceNotificationSubscription(),
326-
"hsdp_notification_subscriber": notification.DataSourceNotificationSubscriber(),
327-
"hsdp_container_host_instances": ch.DataSourceContainerHostInstances(),
328-
"hsdp_iam_group": group.DataSourceIAMGroup(),
329-
"hsdp_iam_role": role.DataSourceIAMRole(),
330-
"hsdp_iam_users": user.DataSourceIAMUsers(),
331-
"hsdp_docker_namespace": namespace.DataSourceDockerNamespace(),
332-
"hsdp_docker_namespaces": namespace.DataSourceDockerNamespaces(),
333-
"hsdp_docker_repository": repository.DataSourceDockerRepository(),
334-
"hsdp_iam_client": client.DataSourceIAMClient(),
335-
"hsdp_connect_mdm_proposition": mdm.DataSourceConnectMDMProposition(),
336-
"hsdp_connect_mdm_application": mdm.DataSourceConnectMDMApplication(),
337-
"hsdp_connect_mdm_standard_services": mdm.DataSourceConnectMDMStandardServices(),
338-
"hsdp_connect_mdm_regions": mdm.DataSourceConnectMDMRegions(),
339-
"hsdp_connect_mdm_oauth_client_scopes": mdm.DataSourceConnectMDMOauthClientScopes(),
340-
"hsdp_connect_mdm_region": mdm.DataSourceConnectMDMRegion(),
341-
"hsdp_connect_mdm_resource_limits": mdm.DataSourceResourceLimits(),
342-
"hsdp_connect_mdm_subscriber_types": mdm.DataSourceConnectMDMSubscriberTypes(),
343-
"hsdp_connect_mdm_storage_classes": mdm.DataSourceConnectMDMStorageClasses(),
344-
"hsdp_connect_mdm_storage_class": mdm.DataSourceConnectMDMStorageClass(),
345-
"hsdp_connect_mdm_standard_service": mdm.DataSourceConnectMDMStandardService(),
346-
"hsdp_connect_mdm_data_subscribers": mdm.DataSourceConnectMDMDataSubscribers(),
347-
"hsdp_connect_mdm_data_adapters": mdm.DataSourceConnectMDMDataAdapters(),
348-
"hsdp_iam_email_templates": email_template.DataSourceIAMEmailTemplates(),
349-
"hsdp_connect_mdm_bucket": mdm.DataSourceConnectMDMBucket(),
350-
"hsdp_connect_mdm_data_type": mdm.DataSourceConnectMDMDataType(),
351-
"hsdp_container_host_security_groups": ch.DataSourceContainerHostSecurityGroups(),
352-
"hsdp_container_host_security_group_details": ch.DataSourceContainerHostSecurityGroupDetails(),
353-
"hsdp_iam_token": iam.DataSourceIAMToken(),
354-
"hsdp_connect_mdm_service_agent": mdm.DataSourceConnectMDMServiceAgent(),
355-
"hsdp_connect_mdm_service_agents": mdm.DataSourceConnectMDMServiceAgents(),
356-
"hsdp_container_host": ch.DataSourceContainerHost(),
357-
"hsdp_iam_permission": iam.DataSourceIAMPermission(),
358-
"hsdp_iam_role_sharing_policies": role_sharing_policy.DataSourceIAMRoleSharingPolicies(),
359-
"hsdp_discovery_service": discovery.DataSourceDiscoveryService(),
360-
"hsdp_connect_mdm_service_action": mdm.DataSourceConnectMDMServiceAction(),
361-
"hsdp_connect_mdm_service_actions": mdm.DataSourceConnectMDMServiceActions(),
362-
"hsdp_blr_store_policy": blr.DataSourceBLRBlobStorePolicyDefinition(),
309+
"hsdp_iam_introspect": iam.DataSourceIAMIntrospect(),
310+
"hsdp_iam_user": user.DataSourceUser(),
311+
"hsdp_iam_service": service.DataSourceService(),
312+
"hsdp_iam_permissions": iam.DataSourceIAMPermissions(),
313+
"hsdp_iam_org": organization.DataSourceIAMOrg(),
314+
"hsdp_iam_proposition": proposition.DataSourceIAMProposition(),
315+
"hsdp_iam_application": application.DataSourceIAMApplication(),
316+
"hsdp_s3creds_access": s3creds.DataSourceS3CredsAccess(),
317+
"hsdp_s3creds_policy": s3creds.DataSourceS3CredsPolicy(),
318+
"hsdp_config": configuration.DataSourceConfig(),
319+
"hsdp_container_host_subnet_types": ch.DataSourceContainerHostSubnetTypes(),
320+
"hsdp_pki_root": pki.DataSourcePKIRoot(),
321+
"hsdp_pki_policy": pki.DataSourcePKIPolicy(),
322+
"hsdp_edge_device": edge.DataSourceEdgeDevice(),
323+
"hsdp_notification_producers": notification.DataSourceNotificationProducers(),
324+
"hsdp_notification_producer": notification.DataSourceNotificationProducer(),
325+
"hsdp_notification_topics": notification.DataSourceNotificationTopics(),
326+
"hsdp_notification_topic": notification.DataSourceNotificationTopic(),
327+
"hsdp_notification_subscription": notification.DataSourceNotificationSubscription(),
328+
"hsdp_notification_subscriber": notification.DataSourceNotificationSubscriber(),
329+
"hsdp_container_host_instances": ch.DataSourceContainerHostInstances(),
330+
"hsdp_iam_group": group.DataSourceIAMGroup(),
331+
"hsdp_iam_role": role.DataSourceIAMRole(),
332+
"hsdp_iam_users": user.DataSourceIAMUsers(),
333+
"hsdp_docker_namespace": namespace.DataSourceDockerNamespace(),
334+
"hsdp_docker_namespaces": namespace.DataSourceDockerNamespaces(),
335+
"hsdp_docker_repository": repository.DataSourceDockerRepository(),
336+
"hsdp_iam_client": client.DataSourceIAMClient(),
337+
"hsdp_connect_mdm_proposition": mdm.DataSourceConnectMDMProposition(),
338+
"hsdp_connect_mdm_application": mdm.DataSourceConnectMDMApplication(),
339+
"hsdp_connect_mdm_standard_services": mdm.DataSourceConnectMDMStandardServices(),
340+
"hsdp_connect_mdm_regions": mdm.DataSourceConnectMDMRegions(),
341+
"hsdp_connect_mdm_oauth_client_scopes": mdm.DataSourceConnectMDMOauthClientScopes(),
342+
"hsdp_connect_mdm_region": mdm.DataSourceConnectMDMRegion(),
343+
"hsdp_connect_mdm_resource_limits": mdm.DataSourceResourceLimits(),
344+
"hsdp_connect_mdm_subscriber_types": mdm.DataSourceConnectMDMSubscriberTypes(),
345+
"hsdp_connect_mdm_storage_classes": mdm.DataSourceConnectMDMStorageClasses(),
346+
"hsdp_connect_mdm_storage_class": mdm.DataSourceConnectMDMStorageClass(),
347+
"hsdp_connect_mdm_standard_service": mdm.DataSourceConnectMDMStandardService(),
348+
"hsdp_connect_mdm_data_subscribers": mdm.DataSourceConnectMDMDataSubscribers(),
349+
"hsdp_connect_mdm_data_adapters": mdm.DataSourceConnectMDMDataAdapters(),
350+
"hsdp_connect_iot_provisioning_orgconfiguration": provisioning.DataSourceConnectIoTProvisioningOrgConfiguration(),
351+
"hsdp_iam_email_templates": email_template.DataSourceIAMEmailTemplates(),
352+
"hsdp_connect_mdm_bucket": mdm.DataSourceConnectMDMBucket(),
353+
"hsdp_connect_mdm_data_type": mdm.DataSourceConnectMDMDataType(),
354+
"hsdp_container_host_security_groups": ch.DataSourceContainerHostSecurityGroups(),
355+
"hsdp_container_host_security_group_details": ch.DataSourceContainerHostSecurityGroupDetails(),
356+
"hsdp_iam_token": iam.DataSourceIAMToken(),
357+
"hsdp_connect_mdm_service_agent": mdm.DataSourceConnectMDMServiceAgent(),
358+
"hsdp_connect_mdm_service_agents": mdm.DataSourceConnectMDMServiceAgents(),
359+
"hsdp_container_host": ch.DataSourceContainerHost(),
360+
"hsdp_iam_permission": iam.DataSourceIAMPermission(),
361+
"hsdp_iam_role_sharing_policies": role_sharing_policy.DataSourceIAMRoleSharingPolicies(),
362+
"hsdp_discovery_service": discovery.DataSourceDiscoveryService(),
363+
"hsdp_connect_mdm_service_action": mdm.DataSourceConnectMDMServiceAction(),
364+
"hsdp_connect_mdm_service_actions": mdm.DataSourceConnectMDMServiceActions(),
365+
"hsdp_blr_store_policy": blr.DataSourceBLRBlobStorePolicyDefinition(),
363366
},
364367
ConfigureContextFunc: providerConfigure(build),
365368
}
@@ -458,6 +461,7 @@ func providerConfigure(build string) schema.ConfigureContextFunc {
458461
c.SetupDiscoveryClient()
459462
c.SetupBLRClient()
460463
c.SetupDBSClient()
464+
c.SetupProvisioningClient()
461465

462466
ma, err := jsonformat.NewMarshaller(false, "", "", fhirversion.STU3)
463467
if err != nil {

internal/config/config.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http"
77

88
"github.com/dip-software/go-dip-api/connect/dbs"
9+
"github.com/dip-software/go-dip-api/connect/provisioning"
910

1011
"github.com/dip-software/go-dip-api/connect/blr"
1112

@@ -66,6 +67,7 @@ type Config struct {
6667
mdmClient *mdm.Client
6768
discoveryClient *discovery.Client
6869
dbsClient *dbs.Client
70+
provisioningClient *provisioning.Client
6971
DebugStdErr bool `json:"debugging"`
7072
credsClientErr error
7173
cartelClientErr error
@@ -78,6 +80,7 @@ type Config struct {
7880
discoveryClientErr error
7981
blrClientErr error
8082
dbsClientErr error
83+
provisioningClientErr error
8184
TimeZone string `json:"time_zone"`
8285

8386
STU3MA *jsonformat.Marshaller `json:"-"`
@@ -362,6 +365,23 @@ func (c *Config) DBSClient(principal ...*Principal) (*dbs.Client, error) {
362365
return c.dbsClient, c.dbsClientErr
363366
}
364367

368+
func (c *Config) ProvisioningClient(principal ...*Principal) (*provisioning.Client, error) {
369+
if len(principal) > 0 && principal[0] != nil && principal[0].HasAuth() {
370+
region := principal[0].Region
371+
environment := principal[0].Environment
372+
iamClient, err := c.IAMClient(principal...)
373+
if err != nil {
374+
return nil, err
375+
}
376+
return provisioning.NewClient(iamClient, &provisioning.Config{
377+
Region: region,
378+
Environment: environment,
379+
DebugLog: c.DebugWriter,
380+
})
381+
}
382+
return c.provisioningClient, c.provisioningClientErr
383+
}
384+
365385
// SetupIAMClient sets up an HSDP IAM client
366386
func (c *Config) SetupIAMClient() {
367387
var standardClient *http.Client
@@ -683,3 +703,22 @@ func (c *Config) SetupDBSClient() {
683703
c.dbsClient = client
684704
c.dbsClientErr = nil
685705
}
706+
707+
func (c *Config) SetupProvisioningClient() {
708+
if c.iamClientErr != nil {
709+
c.provisioningClientErr = fmt.Errorf("IAM client error in SetupProvisioningClient: %w", c.iamClientErr)
710+
return
711+
}
712+
client, err := provisioning.NewClient(c.iamClient, &provisioning.Config{
713+
Region: c.Region,
714+
Environment: c.Environment,
715+
DebugLog: c.DebugWriter,
716+
})
717+
if err != nil {
718+
c.provisioningClient = nil
719+
c.provisioningClientErr = err
720+
return
721+
}
722+
c.provisioningClient = client
723+
c.provisioningClientErr = nil
724+
}

0 commit comments

Comments
 (0)