AvailabilityDomainAwareTrait.groovy
01 /*
02  * SPDX-License-Identifier: Apache-2.0
03  *
04  * Copyright 2019-2022 Andres Almiray.
05  *
06  * Licensed under the Apache License, Version 2.0 (the "License");
07  * you may not use this file except in compliance with the License.
08  * You may obtain a copy of the License at
09  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 package org.kordamp.gradle.plugin.oci.tasks.traits
19 
20 import com.oracle.bmc.identity.IdentityClient
21 import com.oracle.bmc.identity.model.AvailabilityDomain
22 import com.oracle.bmc.identity.requests.ListAvailabilityDomainsRequest
23 import com.oracle.bmc.identity.responses.ListAvailabilityDomainsResponse
24 import groovy.transform.CompileStatic
25 import org.gradle.api.provider.Property
26 import org.gradle.api.provider.Provider
27 import org.gradle.api.tasks.Input
28 import org.gradle.api.tasks.Internal
29 import org.gradle.api.tasks.options.Option
30 import org.kordamp.gradle.property.PathAware
31 import org.kordamp.gradle.plugin.oci.tasks.interfaces.ProjectAware
32 import org.kordamp.gradle.property.SimpleStringState
33 import org.kordamp.gradle.property.StringState
34 
35 import static org.kordamp.gradle.util.StringUtils.isBlank
36 
37 /**
38  @author Andres Almiray
39  @since 0.1.0
40  */
41 @CompileStatic
42 trait AvailabilityDomainAwareTrait implements PathAware, ProjectAware {
43     private final StringState state = SimpleStringState.of(project, this, 'oci.availability.domain')
44 
45     @Internal
46     Property<String> getAvailabilityDomain() {
47         state.property
48     }
49 
50     @Input
51     Provider<String> getResolvedAvailabilityDomain() {
52         state.provider
53     }
54 
55     @Option(option = 'availability-domain', description = 'The AvailabilityDomain (REQUIRED).')
56     void setAvailabilityDomain(String availabilityDomain) {
57         getAvailabilityDomain().set(availabilityDomain)
58     }
59 
60     void validateAvailabilityDomain() {
61         if (isBlank(getResolvedAvailabilityDomain().orNull)) {
62             throw new IllegalStateException("Missing value for 'availabilityDomain' in $path")
63         }
64     }
65 
66     AvailabilityDomain validateAvailabilityDomain(IdentityClient identityClient, String compartmentId) {
67         ListAvailabilityDomainsResponse response = identityClient.listAvailabilityDomains(ListAvailabilityDomainsRequest.builder()
68             .compartmentId(compartmentId)
69             .build())
70         AvailabilityDomain ad = response.items.find AvailabilityDomain ad -> ad.name == getResolvedAvailabilityDomain().get() }
71         if (!adthrow new IllegalStateException("Invalid availability domain ${getResolvedAvailabilityDomain().get()}")
72         ad
73     }
74 }