Skip to content

Commit 9d5e549

Browse files
Add gcp secretsmanager to discovery + enable secret init (#6635)
1 parent 3c19058 commit 9d5e549

5 files changed

Lines changed: 85 additions & 1 deletion

File tree

providers/gcp/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ Examples with the GCP project configured:
5757
resources.DiscoverCloudKMSKeyrings,
5858
resources.DiscoverMemorystoreRedis,
5959
resources.DiscoverMemorystoreRedisCluster,
60+
resources.DiscoverSecretManager,
6061
},
6162
Flags: []plugin.Flag{
6263
{

providers/gcp/connection/platform.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ func GetTitleForPlatformName(name string) string {
126126
return "GCP Memorystore for Redis"
127127
case "gcp-memorystore-rediscluster":
128128
return "GCP Memorystore for Redis Cluster"
129+
case "gcp-secretmanager-secret":
130+
return "GCP Secret Manager Secret"
129131
}
130132
return "Google Cloud Platform"
131133
}
@@ -194,6 +196,13 @@ func ResourceTechnologyUrl(service, project, region, objectType, name string) []
194196
default:
195197
return []string{"gcp", project, "memorystore", region, "other"}
196198
}
199+
case "secretmanager":
200+
switch objectType {
201+
case "secret":
202+
return []string{"gcp", project, "secretmanager", region, "secret"}
203+
default:
204+
return []string{"gcp", project, "secretmanager", region, "other"}
205+
}
197206
default:
198207
return []string{"gcp", project, "other"}
199208
}

providers/gcp/resources/discovery.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const (
4747
DiscoveryGkeClusters = "gke-clusters"
4848
DiscoveryComputeInstances = "instances"
4949
DiscoveryStorageBuckets = "storage-buckets"
50+
DiscoverSecretManager = "secretmanager-secrets"
5051
)
5152

5253
var All = []string{
@@ -78,6 +79,7 @@ var Auto = []string{
7879
DiscoverMemorystoreRedis,
7980
DiscoverMemorystoreRedisCluster,
8081
DiscoveryComputeInstances,
82+
DiscoverSecretManager,
8183
}
8284

8385
var AllAPIResources = []string{
@@ -96,6 +98,7 @@ var AllAPIResources = []string{
9698
DiscoverMemorystoreRedis,
9799
DiscoverMemorystoreRedisCluster,
98100
DiscoveryComputeInstances,
101+
DiscoverSecretManager,
99102
}
100103

101104
// List of all CloudSQL types, this will be used during discovery
@@ -813,6 +816,35 @@ func discoverProject(conn *connection.GcpConnection, gcpProject *mqlGcpProject,
813816
})
814817
}
815818
}
819+
if stringx.ContainsAnyOf(discoveryTargets, DiscoverSecretManager) {
820+
secretmanagerService := gcpProject.GetSecretmanager()
821+
if secretmanagerService.Error != nil {
822+
return nil, secretmanagerService.Error
823+
}
824+
secrets := secretmanagerService.Data.GetSecrets()
825+
if secrets.Error != nil {
826+
return nil, secrets.Error
827+
}
828+
for i := range secrets.Data {
829+
secret := secrets.Data[i].(*mqlGcpProjectSecretmanagerServiceSecret)
830+
assetList = append(assetList, &inventory.Asset{
831+
PlatformIds: []string{
832+
connection.NewResourcePlatformID("secretmanager", gcpProject.Id.Data, "global", "secret", secret.Name.Data),
833+
},
834+
Name: secret.Name.Data,
835+
Platform: &inventory.Platform{
836+
Name: "gcp-secretmanager-secret",
837+
Title: connection.GetTitleForPlatformName("gcp-secretmanager-secret"),
838+
Runtime: "gcp",
839+
Kind: "gcp-object",
840+
Family: []string{"google"},
841+
TechnologyUrlSegments: connection.ResourceTechnologyUrl("secretmanager", gcpProject.Id.Data, "global", "secret", secret.Name.Data),
842+
},
843+
Labels: mapStrInterfaceToMapStrStr(secret.GetLabels().Data),
844+
Connections: []*inventory.Config{conn.Conf.Clone(inventory.WithoutDiscovery(), inventory.WithParentConnectionId(conn.Conf.Id))},
845+
})
846+
}
847+
}
816848

817849
return assetList, nil
818850
}

providers/gcp/resources/gcp.lr.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

providers/gcp/resources/secretmanager.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,48 @@ func (g *mqlGcpProjectSecretmanagerServiceSecret) id() (string, error) {
166166
return g.ResourcePath.Data, g.ResourcePath.Error
167167
}
168168

169+
func initGcpProjectSecretmanagerServiceSecret(runtime *plugin.Runtime, args map[string]*llx.RawData) (map[string]*llx.RawData, plugin.Resource, error) {
170+
// If we already have all the fields populated (e.g., from CreateResource in secrets()), just return.
171+
if len(args) > 3 {
172+
return args, nil, nil
173+
}
174+
175+
// Resolve from asset identifier when accessed as a discovered asset
176+
if len(args) == 0 {
177+
if args == nil {
178+
args = make(map[string]*llx.RawData)
179+
}
180+
if ids := getAssetIdentifier(runtime); ids != nil {
181+
args["name"] = llx.StringData(ids.name)
182+
args["projectId"] = llx.StringData(ids.project)
183+
} else {
184+
return nil, nil, errors.New("no asset identifier found")
185+
}
186+
}
187+
188+
obj, err := CreateResource(runtime, "gcp.project.secretmanagerService", map[string]*llx.RawData{
189+
"projectId": args["projectId"],
190+
})
191+
if err != nil {
192+
return nil, nil, err
193+
}
194+
svc := obj.(*mqlGcpProjectSecretmanagerService)
195+
secrets := svc.GetSecrets()
196+
if secrets.Error != nil {
197+
return nil, nil, secrets.Error
198+
}
199+
200+
nameVal := args["name"].Value.(string)
201+
for _, s := range secrets.Data {
202+
secret := s.(*mqlGcpProjectSecretmanagerServiceSecret)
203+
if secret.Name.Data == nameVal {
204+
return args, secret, nil
205+
}
206+
}
207+
208+
return nil, nil, fmt.Errorf("secret %q not found", nameVal)
209+
}
210+
169211
func (g *mqlGcpProjectSecretmanagerServiceSecret) versions() ([]any, error) {
170212
if g.ResourcePath.Error != nil {
171213
return nil, g.ResourcePath.Error

0 commit comments

Comments
 (0)