Files

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
}