blob: 01784fdd167f2df54c335cfa45d0086177244840 [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 @Reference(cardinality = ReferenceCardinality.MANDATORY)
55 protected CoreService coreService;
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY)
58 protected LeadershipService leadershipService;
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY)
61 protected ClusterService clusterService;
62
63 @Reference(cardinality = ReferenceCardinality.MANDATORY)
64 protected KubevirtApiConfigAdminService configAdminService;
65
66 @Reference(cardinality = ReferenceCardinality.MANDATORY)
67 protected KubevirtNodeAdminService nodeAdminService;
68
69 private final ExecutorService eventExecutor = newSingleThreadExecutor(
70 groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
71
72 private final KubevirtApiConfigListener configListener = new InternalKubevirtApiConfigListener();
73
74 private ApplicationId appId;
75 private NodeId localNode;
76
77 @Activate
78 protected void activate() {
79 appId = coreService.getAppId(APP_ID);
80 localNode = clusterService.getLocalNode().id();
81 leadershipService.runForLeadership(appId.name());
82 configAdminService.addListener(configListener);
83
84 log.info("Started");
85 }
86
87 @Deactivate
88 protected void deactivate() {
89 configAdminService.removeListener(configListener);
90 leadershipService.withdraw(appId.name());
91 eventExecutor.shutdown();
92
93 log.info("Stopped");
94 }
95
96 /**
97 * Checks the validity of the given kubernetes API server configuration.
98 *
99 * @param config kubernetes API server configuration
100 * @return validity result
101 */
102 private boolean checkApiServerConfig(KubevirtApiConfig config) {
103 KubernetesClient k8sClient = k8sClient(config);
104 return k8sClient != null && k8sClient.getApiVersion() != null;
105 }
106
Jian Liaaf44b52020-12-27 23:22:46 +0900107 private class InternalKubevirtApiConfigListener implements KubevirtApiConfigListener {
108
109 private boolean isRelevantHelper() {
110 return Objects.equals(localNode, leadershipService.getLeader(appId.name()));
111 }
112
113 @Override
114 public void event(KubevirtApiConfigEvent event) {
115 switch (event.type()) {
116 case KUBEVIRT_API_CONFIG_CREATED:
117 eventExecutor.execute(() -> processConfigCreation(event.subject()));
118 break;
119 default:
120 break;
121 }
122 }
123
124 private void processConfigCreation(KubevirtApiConfig config) {
125 if (!isRelevantHelper()) {
126 return;
127 }
128
129 if (checkApiServerConfig(config)) {
130 KubevirtApiConfig newConfig = config.updateState(CONNECTED);
131 configAdminService.updateApiConfig(newConfig);
Jian Liaaf44b52020-12-27 23:22:46 +0900132 }
133 }
134 }
135}