
com.netflix.spinnaker.clouddriver.google.security.GoogleNamedAccountCredentials.groovy Maven / Gradle / Ivy
/*
* Copyright 2015 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.netflix.spinnaker.clouddriver.google.security
import com.google.api.services.compute.Compute
import com.google.api.services.compute.model.*
import com.google.common.annotations.VisibleForTesting
import com.netflix.spinnaker.clouddriver.consul.config.ConsulConfig
import com.netflix.spinnaker.clouddriver.google.ComputeVersion
import com.netflix.spinnaker.clouddriver.google.GoogleCloudProvider
import com.netflix.spinnaker.clouddriver.google.deploy.GCEUtil
import com.netflix.spinnaker.clouddriver.google.model.GoogleInstanceTypeDisk
import com.netflix.spinnaker.clouddriver.google.GoogleExecutor
import com.netflix.spinnaker.clouddriver.google.model.GoogleLabeledResource
import com.netflix.spinnaker.clouddriver.names.NamerRegistry
import com.netflix.spinnaker.clouddriver.security.AbstractAccountCredentials
import com.netflix.spinnaker.clouddriver.security.AccountCredentials
import com.netflix.spinnaker.fiat.model.resources.Permissions
import com.netflix.spinnaker.moniker.Namer
import groovy.transform.TupleConstructor
import groovy.util.logging.Slf4j
@Slf4j
@TupleConstructor
class GoogleNamedAccountCredentials extends AbstractAccountCredentials {
// Sorted in reverse clock speed order as per the table here (https://cloud.google.com/compute/docs/regions-zones/regions-zones#available).
static final List SORTED_CPU_PLATFORMS = [
"Intel Sandy Bridge",
"Intel Ivy Bridge",
"Intel Haswell",
"Intel Broadwell",
"Intel Skylake"
]
public final static String CREDENTIALS_TYPE = "gce";
final String name // aka accountName
final String environment
final String accountType
final String cloudProvider = GoogleCloudProvider.ID // duh.
final List requiredGroupMembership
final Permissions permissions
final GoogleCredentials credentials
final String project
final String xpnHostProject
final String applicationName
final List imageProjects
final ComputeVersion computeVersion
final Map> regionToZonesMap
final Map locationToInstanceTypesMap
final Map> locationToCpuPlatformsMap
final List instanceTypeDisks
final ConsulConfig consulConfig
final Compute compute
final String userDataFile
final List regionsToManage
final Map zoneToAcceleratorTypesMap
static class Builder {
String name
String environment
String accountType
Namer namer
List requiredGroupMembership = []
Permissions permissions = Permissions.EMPTY
String project
String xpnHostProject
String applicationName
List imageProjects = []
ComputeVersion computeVersion = ComputeVersion.DEFAULT
Map> regionToZonesMap = [:]
Map locationToInstanceTypesMap = [:]
Map zoneToAcceleratorTypesMap = [:]
Map> locationToCpuPlatformsMap
List instanceTypeDisks = []
String jsonKey
String serviceAccountId
String serviceAccountProject
GoogleCredentials credentials
Compute compute
ConsulConfig consulConfig
String userDataFile
List regionsToManage
/**
* If true, overwrites any value in regionToZoneMap, locationToInstanceTypesMap and locationToCpuPlatformsMap with values from the platform.
*/
boolean liveLookupsEnabled = true
Builder name(String name) {
this.name = name
return this
}
Builder environment(String environment) {
this.environment = environment
return this
}
Builder accountType(String accountType) {
this.accountType = accountType
return this
}
Builder namer(Namer namer) {
this.namer = namer
return this
}
Builder requiredGroupMembership(List requiredGroupMembership) {
this.requiredGroupMembership = requiredGroupMembership
return this
}
Builder permissions(Permissions permissions) {
if (permissions.isRestricted()) {
this.requiredGroupMembership = []
this.permissions = permissions
}
return this
}
Builder project(String project) {
this.project = project
return this
}
Builder applicationName(String applicationName) {
this.applicationName = applicationName
return this
}
Builder imageProjects(List imageProjects) {
this.imageProjects = imageProjects
return this
}
Builder computeVersion(ComputeVersion version) {
this.computeVersion = version
return this
}
Builder jsonKey(String jsonKey) {
this.jsonKey = jsonKey
return this
}
Builder serviceAccountId(String serviceAccountId) {
this.serviceAccountId = serviceAccountId
return this
}
Builder serviceAccountProject(String serviceAccountProject) {
this.serviceAccountProject = serviceAccountProject
return this
}
@VisibleForTesting
Builder regionToZonesMap(Map> regionToZonesMap) {
this.regionToZonesMap = regionToZonesMap
return this
}
@VisibleForTesting
Builder locationToInstanceTypesMap(Map locationToInstanceTypesMap) {
this.locationToInstanceTypesMap = locationToInstanceTypesMap
return this
}
Builder locationToCpuPlatformsMap(Map> locationToCpuPlatformsMap) {
this.locationToCpuPlatformsMap = locationToCpuPlatformsMap
return this
}
Builder instanceTypeDisks(List instanceTypeDisks) {
this.instanceTypeDisks = instanceTypeDisks
return this
}
Builder liveLookupsEnabled(boolean enabled) {
this.liveLookupsEnabled = enabled
return this
}
Builder consulConfig(ConsulConfig consulConfig) {
if (consulConfig?.enabled) {
consulConfig.applyDefaults()
this.consulConfig = consulConfig
}
return this
}
Builder userDataFile(String userDataFile) {
this.userDataFile = userDataFile
return this
}
Builder regionsToManage(List regionsToManage, List defaultRegions) {
this.regionsToManage = (regionsToManage != null) ? regionsToManage : defaultRegions
return this
}
@VisibleForTesting
Builder credentials(GoogleCredentials credentials) {
this.credentials = credentials
this.liveLookupsEnabled = false
return this
}
@VisibleForTesting
Builder compute(Compute compute) {
this.compute = compute
this.liveLookupsEnabled = false
return this
}
GoogleNamedAccountCredentials build() {
GoogleCredentials credentials = this.credentials
GString credInfo = "Google Credentials ($name): "
if (credentials == null) {
if (jsonKey) {
credInfo += "From JSON key"
credentials = new GoogleJsonCredentials(project, computeVersion, jsonKey)
} else if (serviceAccountId && serviceAccountProject) {
credInfo += "Impersonating $serviceAccountProject/$serviceAccountId"
credentials = new GoogleImpersonatedServiceAccountCredentials(project,
computeVersion,
serviceAccountId,
serviceAccountProject)
} else {
credInfo += "Application Default Credentials"
credentials = new GoogleCredentials(project, computeVersion)
}
} else {
credInfo += "Direct"
}
log.info(credInfo)
Compute compute = this.compute
if (compute == null) {
compute = credentials.getCompute(applicationName)
}
AccountForClient.addGoogleClient(compute, name)
if (liveLookupsEnabled) {
xpnHostProject = GoogleExecutor.timeExecute(
GoogleExecutor.getRegistry(),
compute.projects().getXpnHost(project),
"google.api",
"compute.projects.getXpnHost",
GoogleExecutor.TAG_SCOPE, GoogleExecutor.SCOPE_GLOBAL
)?.getName()
regionToZonesMap = queryRegions(compute, project)
locationToInstanceTypesMap = queryInstanceTypes(compute, project, regionToZonesMap)
zoneToAcceleratorTypesMap = queryAcceleratorTypes(compute, project)
locationToCpuPlatformsMap = queryCpuPlatforms(compute, project, regionToZonesMap)
}
if (namer && name) {
NamerRegistry.lookup()
.withProvider(GoogleCloudProvider.getID())
.withAccount(name)
.setNamer(GoogleLabeledResource.class, namer)
}
new GoogleNamedAccountCredentials(name,
environment,
accountType,
GoogleCloudProvider.ID,
requiredGroupMembership,
permissions,
credentials,
project,
xpnHostProject,
applicationName,
imageProjects,
computeVersion,
regionToZonesMap,
locationToInstanceTypesMap,
locationToCpuPlatformsMap,
instanceTypeDisks,
consulConfig,
compute,
userDataFile,
regionsToManage,
zoneToAcceleratorTypesMap)
}
}
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy