blob: 27866d42b2b84248b0589daff2c9662a036f47b7 [file] [log] [blame]
Jian Liaaf44b52020-12-27 23:22:46 +09001/*
2 * Copyright 2020-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.kubevirtnode.impl;
17
Jian Liaaf44b52020-12-27 23:22:46 +090018import io.fabric8.kubernetes.client.KubernetesClient;
Jian Liaaf44b52020-12-27 23:22:46 +090019import org.onosproject.cluster.ClusterService;
20import org.onosproject.cluster.LeadershipService;
21import org.onosproject.cluster.NodeId;
22import org.onosproject.core.ApplicationId;
23import org.onosproject.core.CoreService;
Jian Liaaf44b52020-12-27 23:22:46 +090024import org.onosproject.kubevirtnode.api.KubevirtApiConfig;
25import org.onosproject.kubevirtnode.api.KubevirtApiConfigAdminService;
26import org.onosproject.kubevirtnode.api.KubevirtApiConfigEvent;
27import org.onosproject.kubevirtnode.api.KubevirtApiConfigListener;
Jian Liaaf44b52020-12-27 23:22:46 +090028import org.onosproject.kubevirtnode.api.KubevirtNodeAdminService;
Jian Liaaf44b52020-12-27 23:22:46 +090029import org.osgi.service.component.annotations.Activate;
30import org.osgi.service.component.annotations.Component;
31import org.osgi.service.component.annotations.Deactivate;
32import org.osgi.service.component.annotations.Reference;
33import org.osgi.service.component.annotations.ReferenceCardinality;
34import org.slf4j.Logger;
35
36import java.util.Objects;
37import java.util.concurrent.ExecutorService;
38
39import static java.util.concurrent.Executors.newSingleThreadExecutor;
40import static org.onlab.util.Tools.groupedThreads;
41import static org.onosproject.kubevirtnode.api.KubevirtApiConfig.State.CONNECTED;
42import static org.onosproject.kubevirtnode.api.KubevirtApiConfigService.APP_ID;
Jian Liaaf44b52020-12-27 23:22:46 +090043import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.k8sClient;
44import static org.slf4j.LoggerFactory.getLogger;
45
46/**
47 * Handles the state of KubeVirt API server configuration.
48 */
49@Component(immediate = true)
50public class DefaultKubevirtApiConfigHandler {
51
52 private final Logger log = getLogger(getClass());
53
Jian Liaaf44b52020-12-27 23:22:46 +090054 private static final long SLEEP_MS = 10000; // we wait 10s
55
56 @Reference(cardinality = ReferenceCardinality.MANDATORY)
57 protected CoreService coreService;
58
59 @Reference(cardinality = ReferenceCardinality.MANDATORY)
60 protected LeadershipService leadershipService;
61
62 @Reference(cardinality = ReferenceCardinality.MANDATORY)
63 protected ClusterService clusterService;
64
65 @Reference(cardinality = ReferenceCardinality.MANDATORY)
66 protected KubevirtApiConfigAdminService configAdminService;
67
68 @Reference(cardinality = ReferenceCardinality.MANDATORY)
69 protected KubevirtNodeAdminService nodeAdminService;
70
71 private final ExecutorService eventExecutor = newSingleThreadExecutor(
72 groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
73
74 private final KubevirtApiConfigListener configListener = new InternalKubevirtApiConfigListener();
75
76 private ApplicationId appId;
77 private NodeId localNode;
78
79 @Activate
80 protected void activate() {
81 appId = coreService.getAppId(APP_ID);
82 localNode = clusterService.getLocalNode().id();
83 leadershipService.runForLeadership(appId.name());
84 configAdminService.addListener(configListener);
85
86 log.info("Started");
87 }
88
89 @Deactivate
90 protected void deactivate() {
91 configAdminService.removeListener(configListener);
92 leadershipService.withdraw(appId.name());
93 eventExecutor.shutdown();
94
95 log.info("Stopped");
96 }
97
98 /**
99 * Checks the validity of the given kubernetes API server configuration.
100 *
101 * @param config kubernetes API server configuration
102 * @return validity result
103 */
104 private boolean checkApiServerConfig(KubevirtApiConfig config) {
105 KubernetesClient k8sClient = k8sClient(config);
106 return k8sClient != null && k8sClient.getApiVersion() != null;
107 }
108
Jian Liaaf44b52020-12-27 23:22:46 +0900109 private class InternalKubevirtApiConfigListener implements KubevirtApiConfigListener {
110
111 private boolean isRelevantHelper() {
112 return Objects.equals(localNode, leadershipService.getLeader(appId.name()));
113 }
114
115 @Override
116 public void event(KubevirtApiConfigEvent event) {
117 switch (event.type()) {
118 case KUBEVIRT_API_CONFIG_CREATED:
119 eventExecutor.execute(() -> processConfigCreation(event.subject()));
120 break;
121 default:
122 break;
123 }
124 }
125
126 private void processConfigCreation(KubevirtApiConfig config) {
127 if (!isRelevantHelper()) {
128 return;
129 }
130
131 if (checkApiServerConfig(config)) {
132 KubevirtApiConfig newConfig = config.updateState(CONNECTED);
133 configAdminService.updateApiConfig(newConfig);
Jian Liaaf44b52020-12-27 23:22:46 +0900134 }
135 }
136 }
137}