From e1cafc7224c74d210302033726f62e29735373c3 Mon Sep 17 00:00:00 2001 From: Jeyrs Chabu Date: Fri, 17 May 2019 10:56:52 -0700 Subject: [PATCH] feat(bakery): Add rosco service selector (#800) - Added RoscoServiceSelector to find services by location/region - Make bakeService use the roscoServiceSelector - Refactor OrcaServiceSelector criteria instantiation --- build.gradle | 2 +- .../spinnaker/gate/config/GateConfig.groovy | 10 +++++ .../gate/services/BakeService.groovy | 15 ++++---- .../internal/OrcaServiceSelector.java | 16 ++++---- .../internal/RoscoServiceSelector.java | 38 +++++++++++++++++++ 5 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/internal/RoscoServiceSelector.java diff --git a/build.gradle b/build.gradle index 0d6219850a..b53ce8e0ac 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { kotlinVersion = "1.3.21" - korkVersion = "5.3.1" + korkVersion = "5.3.2" fiatVersion = "1.0.4" } repositories { diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/config/GateConfig.groovy b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/config/GateConfig.groovy index ede82bcf9e..aa554647a4 100644 --- a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/config/GateConfig.groovy +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/config/GateConfig.groovy @@ -43,6 +43,7 @@ import com.netflix.spinnaker.gate.services.internal.MineService import com.netflix.spinnaker.gate.services.internal.OrcaService import com.netflix.spinnaker.gate.services.internal.OrcaServiceSelector import com.netflix.spinnaker.gate.services.internal.RoscoService +import com.netflix.spinnaker.gate.services.internal.RoscoServiceSelector import com.netflix.spinnaker.gate.services.internal.SwabbieService import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService import com.netflix.spinnaker.kork.web.selector.DefaultServiceSelector @@ -194,6 +195,15 @@ class GateConfig extends RedisHttpSessionConfiguration { createClient "rosco", RoscoService, okHttpClient } + @Bean + @ConditionalOnProperty('services.rosco.enabled') + RoscoServiceSelector roscoServiceSelector(OkHttpClient okHttpClient, RoscoService defaultService) { + return new RoscoServiceSelector( + createClientSelector("rosco", RoscoService, okHttpClient), + defaultService + ) + } + //---- optional backend components: @Bean @ConditionalOnProperty('services.echo.enabled') diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/BakeService.groovy b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/BakeService.groovy index 100e0ff8eb..8b5ea445b2 100644 --- a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/BakeService.groovy +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/BakeService.groovy @@ -16,7 +16,7 @@ package com.netflix.spinnaker.gate.services -import com.netflix.spinnaker.gate.services.internal.RoscoService +import com.netflix.spinnaker.gate.services.internal.RoscoServiceSelector import groovy.util.logging.Slf4j import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.context.properties.ConfigurationProperties @@ -26,20 +26,19 @@ import org.springframework.stereotype.Component @Component @ConfigurationProperties('services.rosco.defaults') class BakeService { - @Autowired(required = false) - RoscoService roscoService + RoscoServiceSelector roscoServiceSelector // Default bake options from configuration. List bakeOptions def bakeOptions() { - roscoService ? roscoService.bakeOptions() : bakeOptions + roscoServiceSelector ? roscoServiceSelector.withLocation().bakeOptions() : bakeOptions } def bakeOptions(String cloudProvider) { - if (roscoService) { - return roscoService.bakeOptions(cloudProvider) + if (roscoServiceSelector) { + return roscoServiceSelector.withLocation().bakeOptions(cloudProvider) } def bakeOpts = bakeOptions.find { it.cloudProvider == cloudProvider } if (bakeOpts) { @@ -49,8 +48,8 @@ class BakeService { } String lookupLogs(String region, String statusId) { - if (roscoService) { - def logsMap = roscoService.lookupLogs(region, statusId) + if (roscoServiceSelector) { + def logsMap = roscoServiceSelector.withLocation(region).lookupLogs(region, statusId) if (logsMap?.logsContent) { return "
$logsMap.logsContent
" diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/internal/OrcaServiceSelector.java b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/internal/OrcaServiceSelector.java index d01f816bf5..da20ae223a 100644 --- a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/internal/OrcaServiceSelector.java +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/internal/OrcaServiceSelector.java @@ -28,17 +28,15 @@ public OrcaServiceSelector(SelectableService selectableService) { } public OrcaService withContext(RequestContext context) { - SelectableService.Criteria criteria = - new SelectableService.Criteria(null, null, null, null, null); - + SelectableService.Criteria criteria = new SelectableService.Criteria(); if (context != null) { criteria = - new SelectableService.Criteria( - context.getApplication(), - context.getAuthenticatedUser(), - context.getExecutionType(), - context.getExecutionId(), - context.getOrigin()); + criteria + .withApplication(context.getApplication()) + .withAuthenticatedUser(context.getAuthenticatedUser()) + .withExecutionId(context.getExecutionId()) + .withOrigin(context.getOrigin()) + .withExecutionType(context.getExecutionType()); } return (OrcaService) selectableService.getService(criteria); diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/internal/RoscoServiceSelector.java b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/internal/RoscoServiceSelector.java new file mode 100644 index 0000000000..822faafdef --- /dev/null +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/services/internal/RoscoServiceSelector.java @@ -0,0 +1,38 @@ +/* + * Copyright 2019 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.gate.services.internal; + +import com.netflix.spinnaker.kork.web.selector.SelectableService; + +public class RoscoServiceSelector { + private final SelectableService selectableService; + private final RoscoService defaultService; + + public RoscoServiceSelector(SelectableService selectableService, RoscoService roscoService) { + this.selectableService = selectableService; + this.defaultService = roscoService; + } + + public RoscoService withLocation(String location) { + if (location == null) { + return defaultService; + } + + return (RoscoService) + selectableService.getService(new SelectableService.Criteria().withLocation(location)); + } +}