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

com.netflix.spinnaker.clouddriver.google.names.GoogleLabeledResourceNamer Maven / Gradle / Ivy

There is a newer version: 5.89.0
Show newest version
/*
 * Copyright 2018 Schibsted ASA.
 *
 * 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.names;

import com.netflix.frigga.Names;
import com.netflix.spinnaker.clouddriver.google.model.GoogleLabeledResource;
import com.netflix.spinnaker.clouddriver.names.NamingStrategy;
import com.netflix.spinnaker.moniker.Moniker;
import java.util.Map;
import java.util.function.Consumer;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

@Component
public class GoogleLabeledResourceNamer implements NamingStrategy {
  static String GCE_MONIKER_PREFIX = "spinnaker-moniker-";
  static String APP = GCE_MONIKER_PREFIX + "application";
  static String CLUSTER = GCE_MONIKER_PREFIX + "cluster";
  static String DETAIL = GCE_MONIKER_PREFIX + "detail";
  static String STACK = GCE_MONIKER_PREFIX + "stack";
  static String SEQUENCE = GCE_MONIKER_PREFIX + "sequence";

  @Override
  public String getName() {
    return "gceAnnotations";
  }

  public void applyMoniker(GoogleLabeledResource labeledResource, Moniker moniker) {
    Map templateLabels = labeledResource.getLabels();
    setIfPresent(value -> templateLabels.putIfAbsent(APP, value.toLowerCase()), moniker.getApp());
    setIfPresent(
        value -> templateLabels.putIfAbsent(CLUSTER, value.toLowerCase()), moniker.getCluster());
    setIfPresent(
        value -> templateLabels.putIfAbsent(DETAIL, value.toLowerCase()), moniker.getDetail());
    setIfPresent(
        value -> templateLabels.putIfAbsent(STACK, value.toLowerCase()), moniker.getStack());
    setIfPresent(
        value -> templateLabels.put(SEQUENCE, value),
        moniker.getSequence() != null
            ? moniker.getSequence().toString()
            : null); // Always overwrite sequence
  }

  @Override
  public Moniker deriveMoniker(GoogleLabeledResource labeledResource) {
    String name = labeledResource.getName();
    Names parsed = Names.parseName(name);

    Moniker moniker =
        Moniker.builder()
            .app(parsed.getApp())
            .cluster(parsed.getCluster())
            .detail(parsed.getDetail())
            .stack(parsed.getStack())
            .sequence(parsed.getSequence())
            .build();

    Map labels = labeledResource.getLabels();
    if (moniker.getApp() != null && labels != null) {
      setIfPresent(moniker::setApp, labels.get(APP));
      String cluster = labels.get(CLUSTER);
      String stack = labels.get(STACK);
      String detail = labels.get(DETAIL);
      String sequence = labels.get(SEQUENCE);
      if (cluster == null && (detail != null || stack != null)) {
        // If detail or stack is set and not cluster, we generate the cluster name using frigga
        // convention (app-stack-detail)
        cluster = getClusterName(moniker.getApp(), stack, detail);
      }
      setIfPresent(moniker::setStack, stack);
      setIfPresent(moniker::setDetail, detail);
      setIfPresent(moniker::setCluster, cluster);
      setIfPresent(moniker::setSequence, sequence != null ? Integer.parseInt(sequence) : null);
    }
    return moniker;
  }

  private static String getClusterName(String app, String stack, String detail) {
    StringBuilder sb = new StringBuilder(app);
    if (StringUtils.isNotEmpty(stack)) {
      sb.append("-").append(stack);
    }
    if (StringUtils.isEmpty(stack) && StringUtils.isNotEmpty(detail)) {
      sb.append("-");
    }
    if (StringUtils.isNotEmpty(detail)) {
      sb.append("-").append(detail);
    }
    return sb.toString();
  }

  private static  void setIfPresent(Consumer setter, T value) {
    if (value != null) {
      setter.accept(value);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy