blob: b8d9c425d494fb9a7bc5df7f9c2d68e111c9bea3 [file] [log] [blame]
Jian Li105770e2021-01-17 02:18:30 +09001/*
2 * Copyright 2021-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.kubevirtnetworking.impl;
17
18import com.google.common.base.Strings;
19import com.google.common.collect.ImmutableSet;
20import io.fabric8.kubernetes.api.model.Pod;
21import org.onosproject.core.ApplicationId;
22import org.onosproject.core.CoreService;
23import org.onosproject.event.ListenerRegistry;
24import org.onosproject.kubevirtnetworking.api.KubevirtPodAdminService;
25import org.onosproject.kubevirtnetworking.api.KubevirtPodEvent;
26import org.onosproject.kubevirtnetworking.api.KubevirtPodListener;
27import org.onosproject.kubevirtnetworking.api.KubevirtPodService;
28import org.onosproject.kubevirtnetworking.api.KubevirtPodStore;
29import org.onosproject.kubevirtnetworking.api.KubevirtPodStoreDelegate;
30import org.osgi.service.component.annotations.Activate;
31import org.osgi.service.component.annotations.Component;
32import org.osgi.service.component.annotations.Deactivate;
33import org.osgi.service.component.annotations.Reference;
34import org.osgi.service.component.annotations.ReferenceCardinality;
35import org.slf4j.Logger;
36
37import java.util.Set;
38
39import static com.google.common.base.Preconditions.checkArgument;
40import static com.google.common.base.Preconditions.checkNotNull;
41import static org.onosproject.kubevirtnetworking.api.Constants.KUBEVIRT_NETWORKING_APP_ID;
42import static org.slf4j.LoggerFactory.getLogger;
43
44/**
45 * Provides implementation of administering and interfacing kubernetes pod.
46 */
47@Component(
48 immediate = true,
49 service = {KubevirtPodAdminService.class, KubevirtPodService.class}
50)
51public class KubevirtPodManager
52 extends ListenerRegistry<KubevirtPodEvent, KubevirtPodListener>
53 implements KubevirtPodAdminService, KubevirtPodService {
54
55 protected final Logger log = getLogger(getClass());
56
57 private static final String MSG_POD = "Kubernetes pod %s %s";
58 private static final String MSG_CREATED = "created";
59 private static final String MSG_UPDATED = "updated";
60 private static final String MSG_REMOVED = "removed";
61
62 private static final String ERR_NULL_POD = "Kubevirt pod cannot be null";
63 private static final String ERR_NULL_POD_UID = "Kubevirt pod UID cannot be null";
64
65 private static final String ERR_IN_USE = " still in use";
66
67 @Reference(cardinality = ReferenceCardinality.MANDATORY)
68 protected CoreService coreService;
69
70 @Reference(cardinality = ReferenceCardinality.MANDATORY)
71 protected KubevirtPodStore kubevirtPodStore;
72
73 private final KubevirtPodStoreDelegate delegate = new InternalPodStorageDelegate();
74
75 private ApplicationId appId;
76
77 @Activate
78 protected void activate() {
79 appId = coreService.registerApplication(KUBEVIRT_NETWORKING_APP_ID);
80
81 kubevirtPodStore.setDelegate(delegate);
82 log.info("Started");
83 }
84
85 @Deactivate
86 protected void deactivate() {
87 kubevirtPodStore.unsetDelegate(delegate);
88 log.info("Stopped");
89 }
90
91 @Override
92 public void createPod(Pod pod) {
93 checkNotNull(pod, ERR_NULL_POD);
94 checkArgument(!Strings.isNullOrEmpty(pod.getMetadata().getUid()),
95 ERR_NULL_POD_UID);
96
97 kubevirtPodStore.createPod(pod);
98
Jian Li7d3a0c82021-03-24 15:24:18 +090099 log.debug(String.format(MSG_POD, pod.getMetadata().getName(), MSG_CREATED));
Jian Li105770e2021-01-17 02:18:30 +0900100 }
101
102 @Override
103 public void updatePod(Pod pod) {
104 checkNotNull(pod, ERR_NULL_POD);
105 checkArgument(!Strings.isNullOrEmpty(pod.getMetadata().getUid()),
106 ERR_NULL_POD_UID);
107
108 kubevirtPodStore.updatePod(pod);
109
Jian Li7d3a0c82021-03-24 15:24:18 +0900110 log.debug(String.format(MSG_POD, pod.getMetadata().getName(), MSG_UPDATED));
Jian Li105770e2021-01-17 02:18:30 +0900111 }
112
113 @Override
114 public void removePod(String uid) {
115 checkArgument(!Strings.isNullOrEmpty(uid), ERR_NULL_POD_UID);
116
117 synchronized (this) {
118 if (isPodInUse(uid)) {
119 final String error = String.format(MSG_POD, uid, ERR_IN_USE);
120 throw new IllegalStateException(error);
121 }
122
123 Pod pod = kubevirtPodStore.removePod(uid);
124
125 if (pod != null) {
Jian Li7d3a0c82021-03-24 15:24:18 +0900126 log.debug(String.format(MSG_POD,
Jian Li105770e2021-01-17 02:18:30 +0900127 pod.getMetadata().getName(), MSG_REMOVED));
128 }
129 }
130 }
131
132 @Override
133 public void clear() {
134 kubevirtPodStore.clear();
135 }
136
137 @Override
138 public Pod pod(String uid) {
139 checkArgument(!Strings.isNullOrEmpty(uid), ERR_NULL_POD_UID);
140 return kubevirtPodStore.pod(uid);
141 }
142
143 @Override
144 public Set<Pod> pods() {
145 return ImmutableSet.copyOf(kubevirtPodStore.pods());
146 }
147
148 private boolean isPodInUse(String uid) {
149 return false;
150 }
151
152 private class InternalPodStorageDelegate implements KubevirtPodStoreDelegate {
153
154 @Override
155 public void notify(KubevirtPodEvent event) {
156 if (event != null) {
157 log.trace("send kubernetes pod event {}", event);
158 process(event);
159 }
160 }
161 }
162}