All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.netflix.spinnaker.clouddriver.google.provider.agent.GoogleSubnetCachingAgent.groovy Maven / Gradle / Ivy

/*
 * Copyright 2016 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.provider.agent

import com.fasterxml.jackson.databind.ObjectMapper
import com.google.api.services.compute.model.Subnetwork
import com.netflix.spectator.api.Registry
import com.netflix.spinnaker.cats.agent.AgentDataType
import com.netflix.spinnaker.cats.agent.CacheResult
import com.netflix.spinnaker.cats.provider.ProviderCache
import com.netflix.spinnaker.clouddriver.google.cache.CacheResultBuilder
import com.netflix.spinnaker.clouddriver.google.cache.Keys
import com.netflix.spinnaker.clouddriver.google.deploy.GCEUtil
import com.netflix.spinnaker.clouddriver.google.security.GoogleNamedAccountCredentials
import groovy.util.logging.Slf4j

import static com.netflix.spinnaker.cats.agent.AgentDataType.Authority.AUTHORITATIVE
import static com.netflix.spinnaker.clouddriver.google.cache.Keys.Namespace.SUBNETS

@Slf4j
class GoogleSubnetCachingAgent extends AbstractGoogleCachingAgent {

  final String region

  final Set providedDataTypes = [
      AUTHORITATIVE.forType(SUBNETS.ns)
  ] as Set

  String agentType = "$accountName/$region/$GoogleSubnetCachingAgent.simpleName"

  GoogleSubnetCachingAgent(String clouddriverUserAgentApplicationName,
                           GoogleNamedAccountCredentials credentials,
                           ObjectMapper objectMapper,
                           Registry registry,
                           String region) {
    super(clouddriverUserAgentApplicationName,
          credentials,
          objectMapper,
          registry)
    this.region = region
  }

  @Override
  CacheResult loadData(ProviderCache providerCache) {
    List subnetList = loadSubnets()
    buildCacheResult(providerCache, subnetList)
  }

  List loadSubnets() {
    // TODO(duftler): Batch these 2 calls.
    List subnets = timeExecute(compute.subnetworks().list(project, region),
                                           "compute.subnetworks.list",
                                           TAG_SCOPE, SCOPE_REGIONAL, TAG_REGION, region).items as List

    if (xpnHostProject) {
      List hostSubnets = timeExecute(compute.subnetworks().list(xpnHostProject, region),
                                                 "compute.subnetworks.list",
                                                 TAG_SCOPE, SCOPE_REGIONAL, TAG_REGION, region).items as List

      subnets = (subnets ?: []) + (hostSubnets ?: [])
    }

    return subnets
  }

  private CacheResult buildCacheResult(ProviderCache _, List subnetList) {
    log.debug("Describing items in ${agentType}")

    def cacheResultBuilder = new CacheResultBuilder()

    subnetList.each { Subnetwork subnet ->
      def subnetKey = Keys.getSubnetKey(deriveSubnetId(subnet), region, accountName)

      cacheResultBuilder.namespace(SUBNETS.ns).keep(subnetKey).with {
        attributes = [subnet: subnet,project: project]
      }
    }

    log.debug("Caching ${cacheResultBuilder.namespace(SUBNETS.ns).keepSize()} items in ${agentType}")

    cacheResultBuilder.build()
  }

  private String deriveSubnetId(Subnetwork subnet) {
    def subnetProject = GCEUtil.deriveProjectId(subnet.getSelfLink())
    def subnetId = subnet.getName()

    if (subnetProject != project) {
      subnetId = "$subnetProject/$subnetId"
    }

    return subnetId
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy