001/*
002 * VM-Operator
003 * Copyright (C) 2024 Michael N. Lipp
004 * 
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
017 */
018
019package org.jdrupes.vmoperator.common;
020
021import io.kubernetes.client.Discovery.APIResource;
022import io.kubernetes.client.apimachinery.GroupVersionKind;
023import io.kubernetes.client.openapi.ApiException;
024import io.kubernetes.client.util.generic.options.ListOptions;
025import java.io.Reader;
026import java.util.Collection;
027
028/**
029 * A stub for namespaced custom objects. It uses a dynamic model
030 * (see {@link K8sDynamicModel}) for representing the object's
031 * state and can therefore be used for any kind of object, especially
032 * custom objects.
033 */
034@SuppressWarnings("PMD.DataflowAnomalyAnalysis")
035public class K8sDynamicStub
036        extends K8sDynamicStubBase<K8sDynamicModel, K8sDynamicModels> {
037
038    private static DynamicTypeAdapterFactory<K8sDynamicModel,
039            K8sDynamicModels> taf = new K8sDynamicModelTypeAdapterFactory();
040
041    /**
042     * Instantiates a new dynamic stub.
043     *
044     * @param client the client
045     * @param context the context
046     * @param namespace the namespace
047     * @param name the name
048     */
049    public K8sDynamicStub(K8sClient client,
050            APIResource context, String namespace, String name) {
051        super(K8sDynamicModel.class, K8sDynamicModels.class, taf, client,
052            context, namespace, name);
053    }
054
055    /**
056     * Get a dynamic object stub. If the version in parameter
057     * `gvk` is an empty string, the stub refers to the first object with
058     * matching group and kind. 
059     *
060     * @param client the client
061     * @param gvk the group, version and kind
062     * @param namespace the namespace
063     * @param name the name
064     * @return the stub if the object exists
065     * @throws ApiException the api exception
066     */
067    @SuppressWarnings({ "PMD.AvoidBranchingStatementAsLastInLoop",
068        "PMD.AvoidInstantiatingObjectsInLoops", "PMD.UseObjectForClearerAPI" })
069    public static K8sDynamicStub get(K8sClient client,
070            GroupVersionKind gvk, String namespace, String name)
071            throws ApiException {
072        return new K8sDynamicStub(client, apiResource(client, gvk), namespace,
073            name);
074    }
075
076    /**
077     * Get a dynamic object stub.
078     *
079     * @param client the client
080     * @param context the context
081     * @param namespace the namespace
082     * @param name the name
083     * @return the stub if the object exists
084     * @throws ApiException the api exception
085     */
086    @SuppressWarnings({ "PMD.AvoidBranchingStatementAsLastInLoop",
087        "PMD.AvoidInstantiatingObjectsInLoops", "PMD.UseObjectForClearerAPI" })
088    public static K8sDynamicStub get(K8sClient client,
089            APIResource context, String namespace, String name) {
090        return new K8sDynamicStub(client, context, namespace, name);
091    }
092
093    /**
094     * Creates a stub from yaml.
095     *
096     * @param client the client
097     * @param context the context
098     * @param yaml the yaml
099     * @return the k 8 s dynamic stub
100     * @throws ApiException the api exception
101     */
102    public static K8sDynamicStub createFromYaml(K8sClient client,
103            APIResource context, Reader yaml) throws ApiException {
104        var model = new K8sDynamicModel(client.getJSON().getGson(),
105            K8s.yamlToJson(client, yaml));
106        return K8sGenericStub.create(K8sDynamicModel.class,
107            K8sDynamicModels.class, client, context, model,
108            (c, ns, n) -> new K8sDynamicStub(c, context, ns, n));
109    }
110
111    /**
112     * Get the stubs for the objects in the given namespace that match
113     * the criteria from the given options.
114     *
115     * @param client the client
116     * @param namespace the namespace
117     * @param options the options
118     * @return the collection
119     * @throws ApiException the api exception
120     */
121    public static Collection<K8sDynamicStub> list(K8sClient client,
122            APIResource context, String namespace, ListOptions options)
123            throws ApiException {
124        return K8sGenericStub.list(K8sDynamicModel.class,
125            K8sDynamicModels.class, client, context, namespace, options,
126            (c, ns, n) -> new K8sDynamicStub(c, context, ns, n));
127    }
128
129    /**
130     * Get the stubs for the objects in the given namespace.
131     *
132     * @param client the client
133     * @param namespace the namespace
134     * @return the collection
135     * @throws ApiException the api exception
136     */
137    public static Collection<K8sDynamicStub> list(K8sClient client,
138            APIResource context, String namespace)
139            throws ApiException {
140        return list(client, context, namespace, new ListOptions());
141    }
142
143    /**
144     * A factory for creating K8sDynamicModel(s) objects.
145     */
146    public static class K8sDynamicModelTypeAdapterFactory extends
147            DynamicTypeAdapterFactory<K8sDynamicModel, K8sDynamicModels> {
148
149        /**
150         * Instantiates a new dynamic model type adapter factory.
151         */
152        public K8sDynamicModelTypeAdapterFactory() {
153            super(K8sDynamicModel.class, K8sDynamicModels.class);
154        }
155    }
156
157}