Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(retrofit2): replace retrofit client with retrofit2 client #6340

Merged
merged 9 commits into from
Feb 3, 2025
Merged
4 changes: 1 addition & 3 deletions clouddriver-appengine/clouddriver-appengine.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,8 @@ dependencies {
implementation "io.spinnaker.kork:kork-cloud-config-server"
implementation "io.spinnaker.kork:kork-moniker"
implementation "io.spinnaker.kork:kork-retrofit"
implementation "com.jakewharton.retrofit:retrofit1-okhttp3-client"
implementation "io.spinnaker.kork:kork-web"
implementation "com.netflix.spectator:spectator-api"
implementation "com.squareup.retrofit:converter-jackson"
implementation "com.squareup.retrofit:retrofit"
implementation "commons-io:commons-io"
implementation "org.apache.commons:commons-compress:1.21"
implementation "org.apache.groovy:groovy"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@
import java.util.NoSuchElementException;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import retrofit.client.Response;
import retrofit.mime.TypedByteArray;

@Data
@ConfigurationProperties("artifacts.gcs")
Expand All @@ -33,10 +31,6 @@ public class StorageConfigurationProperties {
public static class ManagedAccount {
String name;
String jsonPath;

public static String responseToString(Response response) {
return new String(((TypedByteArray) response.getBody()).getBytes());
}
}

ManagedAccount getAccount(String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,21 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jakewharton.retrofit.Ok3Client;
import com.netflix.spinnaker.clouddriver.appengine.AppengineJobExecutor;
import com.netflix.spinnaker.clouddriver.googlecommon.config.GoogleCommonManagedAccount;
import com.netflix.spinnaker.kork.retrofit.exceptions.SpinnakerRetrofitErrorHandler;
import com.netflix.spinnaker.config.DefaultServiceEndpoint;
import com.netflix.spinnaker.kork.client.ServiceClientProvider;
import com.netflix.spinnaker.kork.retrofit.Retrofit2SyncCall;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import org.springframework.util.StringUtils;
import retrofit.RestAdapter;
import retrofit.client.Response;
import retrofit.converter.JacksonConverter;
import retrofit.http.GET;
import retrofit.http.Headers;
import retrofit.mime.TypedByteArray;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Headers;

@Data
public class AppengineConfigurationProperties {
Expand Down Expand Up @@ -63,7 +61,10 @@ public static class ManagedAccount extends GoogleCommonManagedAccount {
private List<String> omitVersions;
private Long cachingIntervalSeconds;

public void initialize(AppengineJobExecutor jobExecutor, String gcloudPath) {
public void initialize(
AppengineJobExecutor jobExecutor,
String gcloudPath,
ServiceClientProvider serviceClientProvider) {
if (!StringUtils.isEmpty(getJsonPath())) {
jobExecutor.runCommand(
List.of(gcloudPath, "auth", "activate-service-account", "--key-file", getJsonPath()));
Expand All @@ -83,45 +84,35 @@ public void initialize(AppengineJobExecutor jobExecutor, String gcloudPath) {
throw new RuntimeException("Could not find read JSON configuration file.", e);
}
} else {
MetadataService metadataService = createMetadataService();
MetadataService metadataService = createMetadataService(serviceClientProvider);

try {
if (StringUtils.isEmpty(getProject())) {
setProject(responseToString(metadataService.getProject()));
setProject(Retrofit2SyncCall.execute(metadataService.getProject()).string());
}
this.computedServiceAccountEmail =
responseToString(metadataService.getApplicationDefaultServiceAccountEmail());
Retrofit2SyncCall.execute(metadataService.getApplicationDefaultServiceAccountEmail())
.string();
} catch (Exception e) {
throw new RuntimeException(
"Could not find application default credentials for App Engine.", e);
}
}
}

static MetadataService createMetadataService() {
OkHttpClient okHttpClient = new OkHttpClient.Builder().retryOnConnectionFailure(true).build();
RestAdapter restAdapter =
new RestAdapter.Builder()
.setEndpoint(metadataUrl)
.setConverter(new JacksonConverter())
.setClient(new Ok3Client(okHttpClient))
.setErrorHandler(SpinnakerRetrofitErrorHandler.getInstance())
.build();
return restAdapter.create(MetadataService.class);
static MetadataService createMetadataService(ServiceClientProvider serviceClientProvider) {
return serviceClientProvider.getService(
MetadataService.class, new DefaultServiceEndpoint("metadata", metadataUrl));
}

interface MetadataService {
@Headers("Metadata-Flavor: Google")
@GET("/project/project-id")
Response getProject();
Call<ResponseBody> getProject();

@Headers("Metadata-Flavor: Google")
@GET("/instance/service-accounts/default/email")
Response getApplicationDefaultServiceAccountEmail();
}

static String responseToString(Response response) {
return new String(((TypedByteArray) response.getBody()).getBytes());
Call<ResponseBody> getApplicationDefaultServiceAccountEmail();
}

public enum GcloudReleaseTrack {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.netflix.spinnaker.credentials.MapBackedCredentialsRepository;
import com.netflix.spinnaker.credentials.definition.AbstractCredentialsLoader;
import com.netflix.spinnaker.credentials.poller.Poller;
import com.netflix.spinnaker.kork.client.ServiceClientProvider;
import com.netflix.spinnaker.kork.configserver.ConfigFileService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
Expand Down Expand Up @@ -58,7 +59,8 @@ public CredentialsRepository<AppengineNamedAccountCredentials> appengineCredenti
AppengineConfigurationProperties configurationProperties,
AppengineJobExecutor jobExecutor,
ConfigFileService configFileService,
String clouddriverUserAgentApplicationName) {
String clouddriverUserAgentApplicationName,
ServiceClientProvider serviceClientProvider) {
return new CredentialsTypeBaseConfiguration(
applicationContext,
CredentialsTypeProperties
Expand All @@ -74,7 +76,7 @@ public CredentialsRepository<AppengineNamedAccountCredentials> appengineCredenti
if (StringUtils.isEmpty(gcloudPath)) {
gcloudPath = "gcloud";
}
a.initialize(jobExecutor, gcloudPath);
a.initialize(jobExecutor, gcloudPath, serviceClientProvider);

String jsonKey = configFileService.getContents(a.getJsonPath());
return new AppengineNamedAccountCredentials.Builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.netflix.spinnaker.clouddriver.names.NamerRegistry;
import com.netflix.spinnaker.credentials.CredentialsLifecycleHandler;
import com.netflix.spinnaker.credentials.CredentialsRepository;
import com.netflix.spinnaker.kork.client.ServiceClientProvider;
import com.netflix.spinnaker.kork.configserver.ConfigFileService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.context.annotation.UserConfigurations;
Expand Down Expand Up @@ -75,5 +76,10 @@ Registry getRegistry() {
String getClouddriverUserAgentApplicationName() {
return "clouddriverUserAgentApplicationName";
}

@Bean
ServiceClientProvider getServiceClientProvider() {
return mock(ServiceClientProvider.class);
}
}
}
1 change: 1 addition & 0 deletions clouddriver-artifacts/clouddriver-artifacts.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ dependencies {
implementation "io.spinnaker.kork:kork-credentials"
implementation "io.spinnaker.kork:kork-annotations"
implementation "io.spinnaker.kork:kork-exceptions"
implementation "io.spinnaker.kork:kork-retrofit"
implementation "io.spinnaker.kork:kork-security"
implementation "com.netflix.spectator:spectator-api"
implementation("com.netflix.spectator:spectator-ext-aws") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.netflix.spinnaker.clouddriver.core.services.Front50Service;
import com.netflix.spinnaker.kork.annotations.NonnullByDefault;
import com.netflix.spinnaker.kork.artifacts.model.Artifact;
import com.netflix.spinnaker.kork.retrofit.Retrofit2SyncCall;
import com.netflix.spinnaker.security.AuthenticatedRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
Expand Down Expand Up @@ -73,27 +74,33 @@ public InputStream download(Artifact artifact) throws IOException {
pipelineTemplate =
AuthenticatedRequest.allowAnonymous(
() ->
front50Service.getV2PipelineTemplate(
result.pipelineTemplateId, "", result.version));
Retrofit2SyncCall.execute(
front50Service.getV2PipelineTemplate(
result.pipelineTemplateId, "", result.version)));
} else if (artifactId.contains(":")) {
SplitResult result = splitReferenceOnToken(artifactId, ":");
pipelineTemplate =
AuthenticatedRequest.allowAnonymous(
() ->
front50Service.getV2PipelineTemplate(
result.pipelineTemplateId, result.version, ""));
Retrofit2SyncCall.execute(
front50Service.getV2PipelineTemplate(
result.pipelineTemplateId, result.version, "")));
} else {
pipelineTemplate =
AuthenticatedRequest.allowAnonymous(
() -> front50Service.getV2PipelineTemplate(artifactId, "", ""));
() ->
Retrofit2SyncCall.execute(
front50Service.getV2PipelineTemplate(artifactId, "", "")));
}

return new ByteArrayInputStream(objectMapper.writeValueAsBytes(pipelineTemplate));
}

@Override
public List<String> getArtifactNames() {
return front50Service.listV2PipelineTemplates(Collections.singletonList("global")).stream()
return Retrofit2SyncCall.execute(
front50Service.listV2PipelineTemplates(Collections.singletonList("global")))
.stream()
.map(t -> (String) t.get("id"))
.distinct()
.collect(Collectors.toList());
Expand Down
5 changes: 3 additions & 2 deletions clouddriver-aws/clouddriver-aws.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ dependencies {
implementation "io.spinnaker.kork:kork-credentials"
implementation "io.spinnaker.kork:kork-moniker"
implementation "io.spinnaker.kork:kork-retrofit"
implementation "com.squareup.retrofit:converter-jackson"
implementation "com.squareup.retrofit:retrofit"
implementation "io.spinnaker.kork:kork-web"
implementation "com.squareup.retrofit2:converter-jackson"
implementation "io.reactivex:rxjava"
implementation "org.apache.httpcomponents:httpclient"
implementation "org.apache.httpcomponents:httpcore"
Expand All @@ -63,6 +63,7 @@ dependencies {
testImplementation "org.spockframework:spock-spring"
testImplementation "org.springframework.boot:spring-boot-starter-test"
testImplementation "org.springframework:spring-test"
testImplementation "com.squareup.retrofit2:retrofit-mock"

integrationImplementation project(":clouddriver-web")
integrationImplementation "org.springframework:spring-test"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ActiveProfiles;
import retrofit2.mock.Calls;

/**
* Test class for general test cases related to CreateServerGroup operation. Note: launch template
Expand Down Expand Up @@ -178,7 +179,7 @@ public void setup() {
Map applicationMap = new HashMap();
applicationMap.put("application", "myAwsApp");
applicationMap.put("legacyUdf", null);
when(mockFront50Service.getApplication(ASG_NAME)).thenReturn(applicationMap);
when(mockFront50Service.getApplication(ASG_NAME)).thenReturn(Calls.response(applicationMap));

// mock EC2 responses
when(mockRegionScopedProvider.getAmazonEC2()).thenReturn(mockEc2);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.netflix.spinnaker.clouddriver.core.services.Front50Service
import com.netflix.spinnaker.kork.annotations.VisibleForTesting
import com.netflix.spinnaker.kork.core.RetrySupport
import com.netflix.spinnaker.kork.exceptions.SpinnakerException
import com.netflix.spinnaker.kork.retrofit.Retrofit2SyncCall
import com.netflix.spinnaker.kork.retrofit.exceptions.SpinnakerHttpException
import com.netflix.spinnaker.kork.retrofit.exceptions.SpinnakerNetworkException
import com.netflix.spinnaker.kork.retrofit.exceptions.SpinnakerServerException
Expand Down Expand Up @@ -52,7 +53,7 @@ class LocalFileUserDataProvider implements UserDataProvider {
boolean isLegacyUdf(String account, String applicationName) {
Closure<Boolean> result = {
try {
Map application = front50Service.getApplication(applicationName)
Map application = Retrofit2SyncCall.execute(front50Service.getApplication(applicationName))
if (application.legacyUdf == null) {
return localFileUserDataProperties.defaultLegacyUdf
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ import com.netflix.spinnaker.clouddriver.aws.model.edda.EddaRule
import com.netflix.spinnaker.clouddriver.aws.model.edda.LoadBalancerInstanceState
import com.netflix.spinnaker.clouddriver.aws.model.edda.TargetGroupAttributes
import com.netflix.spinnaker.clouddriver.aws.model.edda.TargetGroupHealth
import retrofit.http.GET
import retrofit.http.Path
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path

interface EddaApi {
@GET('/REST/v2/view/loadBalancerInstances;_expand')
List<LoadBalancerInstanceState> loadBalancerInstances()
Call<List<LoadBalancerInstanceState>> loadBalancerInstances()

@GET('/REST/v2/view/targetGroupHealth;_expand')
List<TargetGroupHealth> targetGroupHealth()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,21 @@

package com.netflix.spinnaker.clouddriver.aws.edda

import com.netflix.spinnaker.kork.retrofit.exceptions.SpinnakerRetrofitErrorHandler
import retrofit.RestAdapter
import retrofit.converter.Converter
import com.netflix.spinnaker.config.DefaultServiceEndpoint
import com.netflix.spinnaker.kork.client.ServiceClientProvider

import java.util.regex.Pattern

class EddaApiFactory {
private Converter eddaConverter
private ServiceClientProvider serviceClientProvider

EddaApiFactory(Converter eddaConverter) {
this.eddaConverter = eddaConverter
EddaApiFactory(ServiceClientProvider serviceClientProvider) {
this.serviceClientProvider = serviceClientProvider
}

public EddaApi createApi(String endpointTemplate, String region) {
if (endpointTemplate) {
return new RestAdapter.Builder()
.setConverter(eddaConverter)
.setEndpoint(endpointTemplate.replaceAll(Pattern.quote('{{region}}'), region))
.setErrorHandler(SpinnakerRetrofitErrorHandler.getInstance())
.build()
.create(EddaApi)
return serviceClientProvider.getService(EddaApi, new DefaultServiceEndpoint("eddaapi", endpointTemplate.replaceAll(Pattern.quote('{{region}}'), region)))
}
return null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,16 @@

package com.netflix.spinnaker.clouddriver.aws.edda

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.netflix.awsobjectmapper.AmazonObjectMapper
import com.netflix.awsobjectmapper.AmazonObjectMapperConfigurer
import com.netflix.spinnaker.kork.client.ServiceClientProvider
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import retrofit.converter.Converter
import retrofit.converter.JacksonConverter

@Configuration
class EddaConfiguration {
@Bean
Converter eddaConverter() {
new JacksonConverter(AmazonObjectMapperConfigurer.createConfigured()
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES))
}

@Bean
EddaApiFactory eddaApiFactory(Converter eddaConverter) {
new EddaApiFactory(eddaConverter)
EddaApiFactory eddaApiFactory(ServiceClientProvider serviceClientProvider) {
new EddaApiFactory(serviceClientProvider)
}

}
Loading
Loading