1// Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
2//
3// Example code for Compartments Service API
4//
5
6// This script provides an example on how to move a compartment to a different compartment
7// This script will
8//
9//   * create cp_source_GOSDK under tenancy
10//   * create cp_target_GOSDK under tenancy
11//   * move cp_source_GOSDK under cp_target_GOSDK
12
13package example
14
15import (
16	"context"
17	"fmt"
18	"log"
19
20	"github.com/oracle/oci-go-sdk/common"
21	"github.com/oracle/oci-go-sdk/example/helpers"
22	"github.com/oracle/oci-go-sdk/identity"
23)
24
25// ExampleMoveCompartment Moves an active compartment under a different parent
26func ExampleMoveCompartment() {
27	c, err := identity.NewIdentityClientWithConfigurationProvider(common.DefaultConfigProvider())
28	helpers.FatalIfError(err)
29
30	// The OCID of the tenancy containing the compartment.
31	tenancyID, err := common.DefaultConfigProvider().TenancyOCID()
32	helpers.FatalIfError(err)
33
34	ctx := context.Background()
35	cpSource := createCompartment(ctx, c, common.String(tenancyID), common.String("cp_source_GOSDK"))
36	cpTarget := createCompartment(ctx, c, common.String(tenancyID), common.String("cp_target_GOSDK"))
37
38	moveDetail := identity.MoveCompartmentDetails{
39		TargetCompartmentId: cpTarget,
40	}
41
42	moveRequest := identity.MoveCompartmentRequest{
43		CompartmentId:          cpSource,
44		MoveCompartmentDetails: moveDetail,
45		RequestMetadata:        helpers.GetRequestMetadataWithDefaultRetryPolicy(),
46	}
47
48	resp, err := c.MoveCompartment(ctx, moveRequest)
49	helpers.FatalIfError(err)
50	log.Printf("move compartment with workrequest id: %s", *resp.OpcWorkRequestId)
51	fmt.Println("move compartment request is accepted")
52
53	// get cpSource new parent
54	cpSourceNewParent := getCompartment(ctx, c, cpSource).CompartmentId
55	cpSourceNewParentName := getCompartment(ctx, c, cpSourceNewParent).Name
56
57	log.Printf("cp_source_GOSDK new parent is: %v", *cpSourceNewParentName)
58	fmt.Println("move compartment completed")
59
60	// Output:
61	// move compartment request is accepted
62	// move compartment completed
63}
64
65func createCompartment(ctx context.Context, client identity.IdentityClient, tenantId *string, compartmentName *string) *string {
66	detail := identity.CreateCompartmentDetails{
67		CompartmentId: tenantId,
68		Name:          compartmentName,
69		Description:   compartmentName,
70	}
71	request := identity.CreateCompartmentRequest{
72		CreateCompartmentDetails: detail,
73		RequestMetadata:          helpers.GetRequestMetadataWithDefaultRetryPolicy(),
74	}
75
76	resp, err := client.CreateCompartment(ctx, request)
77	helpers.FatalIfError(err)
78
79	return resp.Id
80}
81
82func getCompartment(ctx context.Context, client identity.IdentityClient, compartmentId *string) identity.Compartment {
83	request := identity.GetCompartmentRequest{
84		CompartmentId:   compartmentId,
85		RequestMetadata: helpers.GetRequestMetadataWithDefaultRetryPolicy(),
86	}
87
88	resp, err := client.GetCompartment(ctx, request)
89	helpers.FatalIfError(err)
90
91	return resp.Compartment
92}
93