OptionalAvailabilityDomainAwareTrait.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.Optional
30 import org.gradle.api.tasks.options.Option
31 import org.kordamp.gradle.plugin.oci.tasks.interfaces.ProjectAware
32 import org.kordamp.gradle.property.PathAware
33 import org.kordamp.gradle.property.SimpleStringState
34 import org.kordamp.gradle.property.StringState
35 
36 /**
37  @author Andres Almiray
38  @since 0.5.0
39  */
40 @CompileStatic
41 trait OptionalAvailabilityDomainAwareTrait implements PathAware, ProjectAware {
42     private final StringState state = SimpleStringState.of(project, this, 'oci.availability.domain')
43 
44     @Internal
45     Property<String> getAvailabilityDomain() {
46         state.property
47     }
48 
49     @Input
50     @Optional
51     Provider<String> getResolvedAvailabilityDomain() {
52         state.provider
53     }
54 
55     @Option(option = 'availability-domain', description = 'The AvailabilityDomain (OPTIONAL).')
56     void setAvailabilityDomain(String availabilityDomain) {
57         getAvailabilityDomain().set(availabilityDomain)
58     }
59 
60     AvailabilityDomain validateAvailabilityDomain(IdentityClient identityClient, String compartmentId) {
61         ListAvailabilityDomainsResponse response = identityClient.listAvailabilityDomains(ListAvailabilityDomainsRequest.builder()
62             .compartmentId(compartmentId)
63             .build())
64         AvailabilityDomain ad = response.items.find AvailabilityDomain ad -> ad.name == getResolvedAvailabilityDomain().get() }
65         if (!adthrow new IllegalStateException("Invalid availability domain ${getResolvedAvailabilityDomain().get()}")
66         ad
67     }
68 }