65 lines
1.9 KiB
Go
65 lines
1.9 KiB
Go
package oci
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/oracle/oci-go-sdk/v65/common"
|
|
"github.com/oracle/oci-go-sdk/v65/identity"
|
|
)
|
|
|
|
// Compartment 是租户下的一个 compartment(不含租户根本身)。
|
|
type Compartment struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
ParentID string `json:"parentId"`
|
|
LifecycleState string `json:"lifecycleState"`
|
|
TimeCreated *time.Time `json:"timeCreated"`
|
|
}
|
|
|
|
// ListCompartments 实现 Client:递归列出租户下全部 ACTIVE compartment。
|
|
func (c *RealClient) ListCompartments(ctx context.Context, cred Credentials) ([]Compartment, error) {
|
|
ic, err := identity.NewIdentityClientWithConfigurationProvider(provider(cred))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("new identity client: %w", err)
|
|
}
|
|
applyProxy(&ic.BaseClient, cred)
|
|
var items []Compartment
|
|
var page *string
|
|
for {
|
|
resp, err := ic.ListCompartments(ctx, identity.ListCompartmentsRequest{
|
|
CompartmentId: &cred.TenancyOCID,
|
|
CompartmentIdInSubtree: common.Bool(true),
|
|
AccessLevel: identity.ListCompartmentsAccessLevelAny,
|
|
LifecycleState: identity.CompartmentLifecycleStateActive,
|
|
Page: page,
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("list compartments: %w", err)
|
|
}
|
|
for _, item := range resp.Items {
|
|
items = append(items, toCompartment(item))
|
|
}
|
|
if resp.OpcNextPage == nil {
|
|
return orEmpty(items), nil
|
|
}
|
|
page = resp.OpcNextPage
|
|
}
|
|
}
|
|
|
|
func toCompartment(item identity.Compartment) Compartment {
|
|
out := Compartment{
|
|
ID: deref(item.Id),
|
|
Name: deref(item.Name),
|
|
Description: deref(item.Description),
|
|
ParentID: deref(item.CompartmentId),
|
|
LifecycleState: string(item.LifecycleState),
|
|
}
|
|
if item.TimeCreated != nil {
|
|
out.TimeCreated = &item.TimeCreated.Time
|
|
}
|
|
return out
|
|
}
|