Skip to content

Commit

Permalink
fix 3922: refining the behavior of adapt and isAdaptable (#3955)
Browse files Browse the repository at this point in the history
* fix #3922: cleaning up adaptable

changes the mock annotation to use exclusion patterns

assumes that we can change the behavior of adapt to skip checks

* applying spotless and making the unsupported check more robust

* fix #3922: further refining to move support checks onto the clients

* correcting the ExtensibleResourceAdapter wrapping behavior
  • Loading branch information
shawkins authored Mar 22, 2022
1 parent 9d41fd6 commit bb6115a
Show file tree
Hide file tree
Showing 168 changed files with 1,578 additions and 1,687 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

#### New Features
* Fix #3407: Added Itemable.withItem to directly associate a resource with the DSL. It can be used as an alternative to Loadable.load when you already have the item. There is also client.resourceList(...).getResources() - that will provide the resource list as Resources. This allows you to implement composite operations easily with lambda: client.resourceList(...).getResources().forEach(r -> r.delete());
* Fix #3922: added Client.supports and Client.hasApiGroup methods

#### _**Note**_: Breaking changes in the API
Please see the [migration guide](doc/MIGRATION-v6.md)
Expand Down
12 changes: 10 additions & 2 deletions doc/MIGRATION-v6.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ To use it, exclude the kubernetes-httpclient-okhttp dependency and add the kuber

- Readiness/OpenShiftReadiness moved from client.internal.readiness to client.readiness
- client.utils classes including Base64, CreateOrReplaceHelper, DeleteOrCreateHelper, OptionalDendencyWrapper, etc. are not in the -api jar, they are still in the -client jar under utils.internal.
- Some other effectively internal classes in dsl.base and other packages were moved to corresponding internal packages - it is unlikely this will affect you unless you developed a custom extension.
- Some other effectively internal classes in dsl.base and other packages were moved to corresponding internal packages - it is unlikely this will affect you unless you developed a custom extension. Extension development can now be done exclusively against the api, please see the previous section.

## Deserialization Resolution

Expand All @@ -103,6 +103,11 @@ The group on the object being deserialized is not required to match the prospect

Extension development may now be done using only the kubernetes-client-api dependency. Please see the [extensions](../extensions).

Of note:
- extension related classes are now in the package io.fabric8.kubernetes.client.extension, which means that you should now use META-INF/services/io.fabric8.kubernetes.client.extension.ExtensionAdapter
- Unless you need support for specific metadata to be returned by calls to rootPaths, apiGroups, or apiResources, you do not need to create a mock module. The mocking logic can accomodate for based adapt/support checks.
- Do not include any check of support in ExtensionAdapter.adapt

## Resource Changes

KubernetesClient.resource no longer returns NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicable, use NamespaceableResource instead.
Expand Down Expand Up @@ -169,14 +174,17 @@ We've removed setter methods `setIntVal`, `setKind`, `setStrVal` from the class.

## Adapt Changes

Client.isAdaptable and Client.adapt will check first if the existing instance is compatible with the desired type.
Client.isAdaptable and Client.adapt will check first if the existing client is an instance of the desired type.

Client.adapt will no longer perform the isAdaptable check - that is you may freely adapt from one Client to another as long as the extension exists. If you need to make a specific check of support, please use the Client.supports method.

## Deprecations

- ApiVersionUtil classes in each extension have been deprecated, you should use io.fabric8.kubernetes.client.utils.ApiVersionUtil instead.
- HttpClientUtils.createHttpClient has been deprecated, you should create your own client factory instead.

- Extension specific EnableXXXMockClient and XXXMockServer classes have been deprecated. You can simply use EnableKubernetesMockClient and KubernetesMockServer instead. Dependencies on the xxx-mock jar are then no longer needed, just a dependency to kubernetes-server-mock.
- Client.supportsApiPath and Client.isAdaptable have been deprecated. Please use Client.supports and Client.hasApiGroup as needed.

## Object Sorting

Expand Down
2 changes: 1 addition & 1 deletion extensions/camel-k/client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
</osgi.export>
<osgi.include.resources>
${osgi.include.resources.default},
/META-INF/services/io.fabric8.kubernetes.client.ExtensionAdapter=target/classes/META-INF/services/io.fabric8.kubernetes.client.ExtensionAdapter
/META-INF/services/io.fabric8.kubernetes.client.extension.ExtensionAdapter=target/classes/META-INF/services/io.fabric8.kubernetes.client.extension.ExtensionAdapter
</osgi.include.resources>
</properties>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,24 @@
*/
package io.fabric8.camelk.client;

import io.fabric8.kubernetes.client.Client;
import io.fabric8.camelk.client.dsl.V1alpha1APIGroupDSL;
import io.fabric8.camelk.client.dsl.V1APIGroupDSL;
import io.fabric8.camelk.client.dsl.V1alpha1APIGroupDSL;
import io.fabric8.kubernetes.client.Client;

/**
* Main interface for CamelK client library.
*/
public interface CamelKClient extends Client {
/**
* API entrypoint for tekton.dev/v1beta1 API group resources
* API entrypoint for camel.apache.org/v1 API group resources
*
* @return {@link V1APIGroupDSL} for CamelK resource operations in this API group.
*/
V1APIGroupDSL v1();

/**
* API entrypoint for tekton.dev/v1alpha1 API group resources
* API entrypoint for camel.apache.org/v1alpha1 API group resources
*
* @return {@link V1alpha1APIGroupDSL} for CamelK resource operations in this API group.
*/
V1alpha1APIGroupDSL v1alpha1();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,18 @@
package io.fabric8.camelk.client;

import io.fabric8.kubernetes.client.Client;
import io.fabric8.kubernetes.client.ExtensionAdapter;
import io.fabric8.kubernetes.client.ExtensionAdapterSupport;
import io.fabric8.kubernetes.client.extension.ExtensionAdapter;

import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class CamelKExtensionAdapter implements ExtensionAdapter<CamelKClient> {

public class CamelKExtensionAdapter extends ExtensionAdapterSupport implements ExtensionAdapter<CamelKClient> {

static final ConcurrentMap<URL, Boolean> IS_CAMELK = new ConcurrentHashMap<>();
static final ConcurrentMap<URL, Boolean> USES_CAMELK_APIGROUPS = new ConcurrentHashMap<>();

@Override
public Class<CamelKClient> getExtensionType() {
return CamelKClient.class;
}

@Override
public Boolean isAdaptable(Client client) {
return isAdaptable(client, IS_CAMELK, USES_CAMELK_APIGROUPS, "camel.apache.org");
}
@Override
public Class<CamelKClient> getExtensionType() {
return CamelKClient.class;
}

@Override
public CamelKClient adapt(Client client) {
return new DefaultCamelKClient(client);
@Override
public CamelKClient adapt(Client client) {
return new DefaultCamelKClient(client);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@
import io.fabric8.kubernetes.client.WithRequestCallable;
import io.fabric8.kubernetes.client.dsl.FunctionCallable;
import io.fabric8.kubernetes.client.extension.ClientAdapter;
import io.fabric8.kubernetes.client.extension.SupportTestingClient;

public class DefaultCamelKClient extends ClientAdapter<DefaultCamelKClient> implements NamespacedCamelKClient {
public class DefaultCamelKClient extends ClientAdapter<DefaultCamelKClient>
implements NamespacedCamelKClient, SupportTestingClient {

public DefaultCamelKClient() {
super();
Expand Down Expand Up @@ -58,4 +60,9 @@ public V1alpha1APIGroupDSL v1alpha1() {
return adapt(V1alpha1APIGroupClient.class);
}

@Override
public boolean isSupported() {
return hasApiGroup("camel.apache.org", true);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,42 +33,42 @@

public class V1APIGroupClient extends ClientAdapter<V1APIGroupClient> implements V1APIGroupDSL {

public V1APIGroupClient() {
super();
}
public V1APIGroupClient() {
super();
}

public V1APIGroupClient(Client client) {
super(client);
}
public V1APIGroupClient(Client client) {
super(client);
}

@Override
protected V1APIGroupClient newInstance(Client client) {
return new V1APIGroupClient(client);
}
@Override
public V1APIGroupClient newInstance(Client client) {
return new V1APIGroupClient(client);
}

@Override
public MixedOperation<Build, BuildList, Resource<Build>> builds() {
return resources(Build.class, BuildList.class);
}
@Override
public MixedOperation<Build, BuildList, Resource<Build>> builds() {
return resources(Build.class, BuildList.class);
}

@Override
public MixedOperation<CamelCatalog, CamelCatalogList, Resource<CamelCatalog>> camelCatalogs() {
return resources(CamelCatalog.class, CamelCatalogList.class);
}
@Override
public MixedOperation<CamelCatalog, CamelCatalogList, Resource<CamelCatalog>> camelCatalogs() {
return resources(CamelCatalog.class, CamelCatalogList.class);
}

@Override
public MixedOperation<Integration, IntegrationList, Resource<Integration>> integrations() {
return resources(Integration.class, IntegrationList.class);
}
@Override
public MixedOperation<Integration, IntegrationList, Resource<Integration>> integrations() {
return resources(Integration.class, IntegrationList.class);
}

@Override
public MixedOperation<IntegrationKit, IntegrationKitList, Resource<IntegrationKit>> integrationKits() {
return resources(IntegrationKit.class, IntegrationKitList.class);
}
@Override
public MixedOperation<IntegrationKit, IntegrationKitList, Resource<IntegrationKit>> integrationKits() {
return resources(IntegrationKit.class, IntegrationKitList.class);
}

@Override
public MixedOperation<IntegrationPlatform, IntegrationPlatformList, Resource<IntegrationPlatform>> integrationPlatforms() {
return resources(IntegrationPlatform.class, IntegrationPlatformList.class);
}
@Override
public MixedOperation<IntegrationPlatform, IntegrationPlatformList, Resource<IntegrationPlatform>> integrationPlatforms() {
return resources(IntegrationPlatform.class, IntegrationPlatformList.class);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,18 @@
*/
package io.fabric8.camelk.client;

import io.fabric8.kubernetes.client.APIGroupExtensionAdapter;
import io.fabric8.kubernetes.client.Client;
import io.fabric8.kubernetes.client.extension.ExtensionAdapter;

public class V1APIGroupExtensionAdapter extends APIGroupExtensionAdapter<V1APIGroupClient> {
@Override
protected String getAPIGroupName() {
return "v1";
}
public class V1APIGroupExtensionAdapter implements ExtensionAdapter<V1APIGroupClient> {

@Override
public Class<V1APIGroupClient> getExtensionType() {
return V1APIGroupClient.class;
}

@Override
protected V1APIGroupClient newInstance(Client client) {
public V1APIGroupClient adapt(Client client) {
return new V1APIGroupClient(client);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public V1alpha1APIGroupClient(Client client) {
}

@Override
protected V1alpha1APIGroupClient newInstance(Client client) {
public V1alpha1APIGroupClient newInstance(Client client) {
return new V1alpha1APIGroupClient(client);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,18 @@
*/
package io.fabric8.camelk.client;

import io.fabric8.kubernetes.client.APIGroupExtensionAdapter;
import io.fabric8.kubernetes.client.Client;
import io.fabric8.kubernetes.client.extension.ExtensionAdapter;

public class V1alpha1APIGroupExtensionAdapter extends APIGroupExtensionAdapter<V1alpha1APIGroupClient> {
@Override
protected String getAPIGroupName() {
return "v1alpha1";
}
public class V1alpha1APIGroupExtensionAdapter implements ExtensionAdapter<V1alpha1APIGroupClient> {

@Override
public Class<V1alpha1APIGroupClient> getExtensionType() {
return V1alpha1APIGroupClient.class;
}

@Override
protected V1alpha1APIGroupClient newInstance(Client client) {
public V1alpha1APIGroupClient adapt(Client client) {
return new V1alpha1APIGroupClient(client);
}
}
2 changes: 1 addition & 1 deletion extensions/certmanager/client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
</osgi.export>
<osgi.include.resources>
${osgi.include.resources.default},
/META-INF/services/io.fabric8.kubernetes.client.ExtensionAdapter=target/classes/META-INF/services/io.fabric8.kubernetes.client.ExtensionAdapter
/META-INF/services/io.fabric8.kubernetes.client.extension.ExtensionAdapter=target/classes/META-INF/services/io.fabric8.kubernetes.client.extension.ExtensionAdapter
</osgi.include.resources>
</properties>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,18 @@
package io.fabric8.certmanager.client;

import io.fabric8.kubernetes.client.Client;
import io.fabric8.kubernetes.client.ExtensionAdapter;
import io.fabric8.kubernetes.client.ExtensionAdapterSupport;
import io.fabric8.kubernetes.client.extension.ExtensionAdapter;

import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class CertManagerExtensionAdapter extends ExtensionAdapterSupport implements ExtensionAdapter<CertManagerClient> {

static final ConcurrentMap<URL, Boolean> IS_VOLUME_SNAPSHOT = new ConcurrentHashMap<>();
static final ConcurrentMap<URL, Boolean> USES_VOLUME_SNAPSHOT_APIGROUPS = new ConcurrentHashMap<>();
public static final String API_GROUP = "cert-manager.io";
public class CertManagerExtensionAdapter implements ExtensionAdapter<CertManagerClient> {

@Override
public Class<CertManagerClient> getExtensionType() {
return CertManagerClient.class;
}

@Override
public Boolean isAdaptable(Client client) {
return isAdaptable(client, IS_VOLUME_SNAPSHOT, USES_VOLUME_SNAPSHOT_APIGROUPS, API_GROUP);
}

@Override
public CertManagerClient adapt(Client client) {
return new DefaultCertManagerClient(client);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,18 @@
*/
package io.fabric8.certmanager.client;

import io.fabric8.kubernetes.client.APIGroupExtensionAdapter;
import io.fabric8.kubernetes.client.Client;
import io.fabric8.kubernetes.client.extension.ExtensionAdapter;

public class V1APIGroupExtensionAdapter extends APIGroupExtensionAdapter<V1APIGroupClient> {
@Override
protected String getAPIGroupName() {
return "v1";
}
public class V1APIGroupExtensionAdapter implements ExtensionAdapter<V1APIGroupClient> {

@Override
public Class<V1APIGroupClient> getExtensionType() {
return V1APIGroupClient.class;
}

@Override
protected V1APIGroupClient newInstance(Client client) {
public V1APIGroupClient adapt(Client client) {
return new V1APIGroupClient(client);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,18 @@
*/
package io.fabric8.certmanager.client;

import io.fabric8.kubernetes.client.APIGroupExtensionAdapter;
import io.fabric8.kubernetes.client.Client;
import io.fabric8.kubernetes.client.extension.ExtensionAdapter;

public class V1alpha2APIGroupExtensionAdapter extends APIGroupExtensionAdapter<V1alpha2APIGroupClient> {
@Override
protected String getAPIGroupName() {
return "v1alpha2";
}
public class V1alpha2APIGroupExtensionAdapter implements ExtensionAdapter<V1alpha2APIGroupClient> {

@Override
public Class<V1alpha2APIGroupClient> getExtensionType() {
return V1alpha2APIGroupClient.class;
}

@Override
protected V1alpha2APIGroupClient newInstance(Client client) {
public V1alpha2APIGroupClient adapt(Client client) {
return new V1alpha2APIGroupClient(client);
}
}
Loading

0 comments on commit bb6115a

Please sign in to comment.