/** * Copyright 2015-2016 Red Hat, Inc, and individual contributors. * * 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 org.wildfly.swarm.topology.openshift.runtime; import com.openshift.restclient.IClient; import org.jboss.as.network.SocketBinding; import org.jboss.msc.inject.Injector; import org.jboss.msc.service.Service; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.ServiceTarget; import org.jboss.msc.service.StartContext; import org.jboss.msc.service.StartException; import org.jboss.msc.service.StopContext; import org.jboss.msc.value.InjectedValue; import org.wildfly.swarm.topology.TopologyConnector; import org.wildfly.swarm.topology.runtime.TopologyManager; import org.wildfly.swarm.topology.runtime.TopologyManagerActivator; /** * Topology connector for OpenShift 3. * * This topology connector knows how to interact with the Kubernetes * API in OpenShift 3 to provide topology information to other systems. * For now it is read-only, exposing Kubernetes Services but relying * on OpenShift methods to create and announces new services. * * The default service account for the OpenShift applications needs read * access to the Kubernetes API. This can be done with a command like: * * <code>oc policy add-role-to-user -z default view</code> * * Relevant environment variables: * <ul> * <li><code>$KUBERNETES_SERVICE_HOST</code> - the hostname of the Kube API * server, set automatically when running on OpenShift</li> * <li><code>$KUBERNETES_SERVICE_PORT</code> - the port of the Kube API * server, set automatically when running on OpenShift</li> * <li><code>$KUBERNETES_NAMESPACE</code> - the Kube namespace to use - * this is the project name when running on OpenShift. This will be * auto-detected in some cases and an error will be thrown if the value * can't be auto-detected and also is not set</li> * </ul> * * @author Ben Browning */ public class OpenShiftTopologyConnector implements Service<OpenShiftTopologyConnector>, TopologyConnector { public static final ServiceName SERVICE_NAME = ServiceName.of("swarm.topology.openshift"); @Override public void start(StartContext context) throws StartException { ServiceTarget target = context.getChildTarget(); ClientService clientService = new ClientService(); target.addService(ClientService.SERVICE_NAME, clientService) .install(); NamespaceService namespaceService = new NamespaceService(); target.addService(NamespaceService.SERVICE_NAME, namespaceService) .addDependency(ClientService.SERVICE_NAME, IClient.class, namespaceService.getClientInjector()) .install(); ServiceWatcher watcher = new ServiceWatcher(); target.addService(ServiceWatcher.SERVICE_NAME, watcher) .addDependency(ClientService.SERVICE_NAME, IClient.class, watcher.getClientInjector()) .addDependency(NamespaceService.SERVICE_NAME, String.class, watcher.getNamespaceInjector()) .addDependency(TopologyManagerActivator.SERVICE_NAME, TopologyManager.class, watcher.getTopologyManagerInjector()) .install(); } @Override public void stop(StopContext context) { } @Override public void advertise(String name, SocketBinding binding, String... tags) { // no-op - let OpenShift handle it } @Override public void unadvertise(String name, SocketBinding binding) { // no-op - let OpenShift handle it } @Override public OpenShiftTopologyConnector getValue() throws IllegalStateException, IllegalArgumentException { return this; } public Injector<TopologyManager> getTopologyManagerInjector() { return this.topologyManagerInjector; } private InjectedValue<TopologyManager> topologyManagerInjector = new InjectedValue<>(); }