88
99 "github.com/rs/zerolog"
1010 "github.com/yandex-cloud/cq-source-yc/internal/util"
11+ "github.com/yandex-cloud/go-genproto/yandex/cloud/billing/v1"
1112 "github.com/yandex-cloud/go-genproto/yandex/cloud/endpoint"
1213 "github.com/yandex-cloud/go-genproto/yandex/cloud/organizationmanager/v1"
1314 "github.com/yandex-cloud/go-genproto/yandex/cloud/resourcemanager/v1"
@@ -18,7 +19,8 @@ import (
1819)
1920
2021// Self-made name for struct holding info about resource model hierarchy.
21- // Each field could be nil.
22+ // Each field could be empty.
23+ // https://yandex.cloud/en/docs/resource-manager/concepts/resources-hierarchy
2224type ResourceHierarchyItem struct {
2325 Organization string
2426 Cloud string
@@ -84,11 +86,36 @@ func (h *ResourceHierarchy) FolderRows() []ResourceHierarchyItem {
8486 })
8587}
8688
89+ type Service string
90+
91+ const (
92+ ServiceResourceManager Service = "resource-manager"
93+ ServiceOrganizationManager Service = "organization-manager"
94+ )
95+
96+ type ResourceType string
97+
8798const (
88- serviceResourceManager = "resource-manager"
89- serviceOrganizationManager = "organization-manager"
99+ ResourceTypeOrganization ResourceType = "organization-manager.organization"
100+ ResourceTypeCloud ResourceType = "resource-manager.cloud"
101+ ResourceTypeFolder ResourceType = "resource-manager.folder"
102+ ResourceTypeBillingAccount ResourceType = "billing.account"
90103)
91104
105+ // TODO: codegen
106+ func ResourceTypeFromProto (p any ) (ResourceType , bool ) {
107+ switch p .(type ) {
108+ case organizationmanager.Organization :
109+ return ResourceTypeOrganization , true
110+ case resourcemanager.Cloud :
111+ return ResourceTypeCloud , true
112+ case billing.BillingAccount :
113+ return ResourceTypeBillingAccount , true
114+ default :
115+ return ResourceType ("" ), false
116+ }
117+ }
118+
92119// discover the hierarchy using Breadth-first search
93120func bfs (ctx context.Context , sdk * ycsdk.SDK , logger zerolog.Logger , init []ResourceHierarchyItem , organizations []string , clouds []string , folders []string , opts ... grpc.CallOption ) ([]ResourceHierarchyItem , error ) {
94121 // call ApiEndpoint.List to fill internal endpoint list in ycsdk.SDK
@@ -123,7 +150,7 @@ func bfs(ctx context.Context, sdk *ycsdk.SDK, logger zerolog.Logger, init []Reso
123150 if item .Folder != "" {
124151 // just append to items
125152 continue
126- } else if item .Cloud != "" && services [serviceResourceManager ] {
153+ } else if item .Cloud != "" && services [string ( ServiceResourceManager ) ] {
127154 // discover folders
128155 it := sdk .ResourceManager ().Folder ().FolderIterator (ctx , & resourcemanager.ListFoldersRequest {CloudId : item .Cloud }, opts ... )
129156 for it .Next () {
@@ -144,7 +171,7 @@ func bfs(ctx context.Context, sdk *ycsdk.SDK, logger zerolog.Logger, init []Reso
144171 }
145172 return nil , err
146173 }
147- } else if item .Organization != "" && services [serviceResourceManager ] {
174+ } else if item .Organization != "" && services [string ( ServiceResourceManager ) ] {
148175 // discover clouds
149176 it := sdk .ResourceManager ().Cloud ().CloudIterator (ctx , & resourcemanager.ListCloudsRequest {OrganizationId : item .Organization }, opts ... )
150177 for it .Next () {
@@ -165,7 +192,7 @@ func bfs(ctx context.Context, sdk *ycsdk.SDK, logger zerolog.Logger, init []Reso
165192 }
166193 return nil , err
167194 }
168- } else if services [serviceOrganizationManager ] {
195+ } else if services [string ( ServiceOrganizationManager ) ] {
169196 // discover organizations
170197 it := sdk .OrganizationManager ().Organization ().OrganizationIterator (ctx , & organizationmanager.ListOrganizationsRequest {}, opts ... )
171198 for it .Next () {
0 commit comments