Skip to content

Commit

Permalink
refactor(retrofit2): replace retrofit client with retrofit2 client (#…
Browse files Browse the repository at this point in the history
…6340)

* refactor(retrofit2): Upgrade EddaApi client from retrofit to retrofit2

* refactor(retrofit2): Upgrade MetadataService client from retrofit to retrofit2

* refactor(retrofit2): Upgrade Front50Service client from retrofit to retrofit2

* refactor(retrofit2): Upgrade AgentApi, KeyValueApi and CatalogApi clients from retrofit to retrofit2

* refactor(retrofit2): Upgrade Eureka, EurekaApi clients from retrofit to retrofit2

* refactor(retrofit2): Upgrade TokenService client from retrofit to retrofit2

* refactor(retrofit2): Upgrade DockerRegistryService client from retrofit to retrofit2

* refactor(retrofit2): remove all retrofit1 references

* refactor(retrofit2): cleaned up unused comments, imports etc
  • Loading branch information
kirangodishala authored Feb 3, 2025
1 parent ebba3ba commit 67a05a3
Show file tree
Hide file tree
Showing 100 changed files with 933 additions and 733 deletions.
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

0 comments on commit 67a05a3

Please sign in to comment.