blob: f9bc2c871f59bbf389c7106bf7efe47f4a6c8a76 [file] [log] [blame]
Jian Lib1cd0b02019-02-21 16:41:40 +09001/*
2 * Copyright 2019-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.k8snetworking.cli;
17
18import com.google.common.collect.Lists;
19import io.fabric8.kubernetes.api.model.Endpoints;
Jian Li324d6dc2019-07-10 10:55:15 +090020import io.fabric8.kubernetes.api.model.Namespace;
Jian Lib1cd0b02019-02-21 16:41:40 +090021import io.fabric8.kubernetes.api.model.Pod;
Jian Li1cf51882019-02-26 14:41:20 +090022import io.fabric8.kubernetes.api.model.extensions.Ingress;
Jian Lif4523d82019-07-07 01:06:09 +090023import io.fabric8.kubernetes.api.model.networking.NetworkPolicy;
Jian Lib1cd0b02019-02-21 16:41:40 +090024import io.fabric8.kubernetes.client.KubernetesClient;
25import org.apache.karaf.shell.api.action.Command;
26import org.apache.karaf.shell.api.action.lifecycle.Service;
27import org.onosproject.cli.AbstractShellCommand;
28import org.onosproject.k8snetworking.api.K8sEndpointsAdminService;
Jian Li1cf51882019-02-26 14:41:20 +090029import org.onosproject.k8snetworking.api.K8sIngressAdminService;
Jian Li324d6dc2019-07-10 10:55:15 +090030import org.onosproject.k8snetworking.api.K8sNamespaceAdminService;
Jian Li3d1111e2019-02-22 02:02:13 +090031import org.onosproject.k8snetworking.api.K8sNetworkAdminService;
Jian Lif4523d82019-07-07 01:06:09 +090032import org.onosproject.k8snetworking.api.K8sNetworkPolicyAdminService;
Jian Lib1cd0b02019-02-21 16:41:40 +090033import org.onosproject.k8snetworking.api.K8sPodAdminService;
34import org.onosproject.k8snetworking.api.K8sServiceAdminService;
35import org.onosproject.k8snetworking.util.K8sNetworkingUtil;
36import org.onosproject.k8snode.api.K8sApiConfig;
37import org.onosproject.k8snode.api.K8sApiConfigService;
38
39import java.util.List;
Jian Li3d1111e2019-02-22 02:02:13 +090040
Jian Li4bd6f2b2019-08-16 21:39:27 +090041import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.syncPortFromPod;
Jian Lib1cd0b02019-02-21 16:41:40 +090042
43/**
44 * Synchronizes kubernetes states.
45 */
46@Service
47@Command(scope = "onos", name = "k8s-sync-states",
48 description = "Synchronizes all kubernetes states")
49public class K8sSyncStateCommand extends AbstractShellCommand {
50
51 private static final String POD_FORMAT = "%-50s%-15s%-15s%-30s";
52 private static final String SERVICE_FORMAT = "%-50s%-30s%-30s";
53 private static final String ENDPOINTS_FORMAT = "%-50s%-50s%-20s";
Jian Li1cf51882019-02-26 14:41:20 +090054 private static final String INGRESS_FORMAT = "%-50s%-15s%-30s";
Jian Lif4523d82019-07-07 01:06:09 +090055 private static final String NETWORK_POLICY_FORMAT = "%-50s%-15s%-30s";
Jian Li324d6dc2019-07-10 10:55:15 +090056 private static final String NAMESPACE_FORMAT = "%-50s%-15s%-30s";
Jian Lib1cd0b02019-02-21 16:41:40 +090057
58 @Override
59 protected void doExecute() {
60 K8sApiConfigService configService = get(K8sApiConfigService.class);
61 K8sPodAdminService podAdminService = get(K8sPodAdminService.class);
Jian Li324d6dc2019-07-10 10:55:15 +090062 K8sNamespaceAdminService namespaceAdminService =
63 get(K8sNamespaceAdminService.class);
Jian Lib1cd0b02019-02-21 16:41:40 +090064 K8sServiceAdminService serviceAdminService =
65 get(K8sServiceAdminService.class);
Jian Li1cf51882019-02-26 14:41:20 +090066 K8sIngressAdminService ingressAdminService =
67 get(K8sIngressAdminService.class);
Jian Lib1cd0b02019-02-21 16:41:40 +090068 K8sEndpointsAdminService endpointsAdminService =
69 get(K8sEndpointsAdminService.class);
Jian Li3d1111e2019-02-22 02:02:13 +090070 K8sNetworkAdminService networkAdminService =
71 get(K8sNetworkAdminService.class);
Jian Lif4523d82019-07-07 01:06:09 +090072 K8sNetworkPolicyAdminService networkPolicyAdminService =
73 get(K8sNetworkPolicyAdminService.class);
Jian Lib1cd0b02019-02-21 16:41:40 +090074
75 K8sApiConfig config =
76 configService.apiConfigs().stream().findAny().orElse(null);
77 if (config == null) {
78 log.error("Failed to find valid kubernetes API configuration.");
79 return;
80 }
81
82 KubernetesClient client = K8sNetworkingUtil.k8sClient(config);
83
84 if (client == null) {
85 log.error("Failed to connect to kubernetes API server.");
86 return;
87 }
88
Jian Li324d6dc2019-07-10 10:55:15 +090089 print("\nSynchronizing kubernetes namespaces");
90 print(NAMESPACE_FORMAT, "Name", "Phase", "Labels");
91 client.namespaces().list().getItems().forEach(ns -> {
92 if (namespaceAdminService.namespace(ns.getMetadata().getUid()) != null) {
93 namespaceAdminService.updateNamespace(ns);
94 } else {
95 namespaceAdminService.createNamespace(ns);
96 }
97 printNamespace(ns);
98 });
99
Jian Lib1cd0b02019-02-21 16:41:40 +0900100 print("Synchronizing kubernetes services");
101 print(SERVICE_FORMAT, "Name", "Cluster IP", "Ports");
Jian Liaf081522019-06-19 20:53:07 +0900102 client.services().inAnyNamespace().list().getItems().forEach(svc -> {
Jian Lib1cd0b02019-02-21 16:41:40 +0900103 if (serviceAdminService.service(svc.getMetadata().getUid()) != null) {
104 serviceAdminService.updateService(svc);
105 } else {
106 serviceAdminService.createService(svc);
107 }
108 printService(svc);
109 });
110
111 print("\nSynchronizing kubernetes endpoints");
112 print(ENDPOINTS_FORMAT, "Name", "IP Addresses", "Ports");
Jian Liaf081522019-06-19 20:53:07 +0900113 client.endpoints().inAnyNamespace().list().getItems().forEach(ep -> {
Jian Lib1cd0b02019-02-21 16:41:40 +0900114 if (endpointsAdminService.endpoints(ep.getMetadata().getUid()) != null) {
115 endpointsAdminService.updateEndpoints(ep);
116 } else {
117 endpointsAdminService.createEndpoints(ep);
118 }
119 printEndpoints(ep);
120 });
121
122 print("\nSynchronizing kubernetes pods");
123 print(POD_FORMAT, "Name", "Namespace", "IP", "Containers");
Jian Liaf081522019-06-19 20:53:07 +0900124 client.pods().inAnyNamespace().list().getItems().forEach(pod -> {
Jian Lib1cd0b02019-02-21 16:41:40 +0900125 if (podAdminService.pod(pod.getMetadata().getUid()) != null) {
126 podAdminService.updatePod(pod);
127 } else {
128 podAdminService.createPod(pod);
129 }
Jian Li3d1111e2019-02-22 02:02:13 +0900130
131 syncPortFromPod(pod, networkAdminService);
132
Jian Lib1cd0b02019-02-21 16:41:40 +0900133 printPod(pod);
134 });
Jian Li1cf51882019-02-26 14:41:20 +0900135
136 print("\nSynchronizing kubernetes ingresses");
137 print(INGRESS_FORMAT, "Name", "Namespace", "LB Addresses");
Jian Liaf081522019-06-19 20:53:07 +0900138 client.extensions().ingresses().inAnyNamespace().list().getItems().forEach(ingress -> {
Jian Li1cf51882019-02-26 14:41:20 +0900139 if (ingressAdminService.ingress(ingress.getMetadata().getUid()) != null) {
140 ingressAdminService.updateIngress(ingress);
141 } else {
142 ingressAdminService.createIngress(ingress);
143 }
144 printIngresses(ingress);
145 });
146
Jian Lif4523d82019-07-07 01:06:09 +0900147 print("\nSynchronizing kubernetes network policies");
148 print(NETWORK_POLICY_FORMAT, "Name", "Namespace", "Types");
149 client.network().networkPolicies().inAnyNamespace().list().getItems().forEach(policy -> {
150 if (networkPolicyAdminService.networkPolicy(policy.getMetadata().getUid()) != null) {
151 networkPolicyAdminService.updateNetworkPolicy(policy);
152 } else {
153 networkPolicyAdminService.createNetworkPolicy(policy);
154 }
155 printNetworkPolicy(policy);
156 });
Jian Li1cf51882019-02-26 14:41:20 +0900157 }
158
159 private void printIngresses(Ingress ingress) {
160
161 List<String> lbIps = Lists.newArrayList();
162
163 ingress.getStatus().getLoadBalancer()
164 .getIngress().forEach(i -> lbIps.add(i.getIp()));
165
166 print(INGRESS_FORMAT,
167 ingress.getMetadata().getName(),
168 ingress.getMetadata().getNamespace(),
169 lbIps.isEmpty() ? "" : lbIps);
Jian Lib1cd0b02019-02-21 16:41:40 +0900170 }
171
172 private void printEndpoints(Endpoints endpoints) {
173 List<String> ips = Lists.newArrayList();
174 List<Integer> ports = Lists.newArrayList();
175
176 endpoints.getSubsets().forEach(e -> {
177 e.getAddresses().forEach(a -> ips.add(a.getIp()));
178 e.getPorts().forEach(p -> ports.add(p.getPort()));
179 });
180
181 print(ENDPOINTS_FORMAT,
182 endpoints.getMetadata().getName(),
183 ips.isEmpty() ? "" : ips,
184 ports.isEmpty() ? "" : ports);
185 }
186
Jian Li324d6dc2019-07-10 10:55:15 +0900187 private void printNamespace(Namespace namespace) {
188 print(NAMESPACE_FORMAT,
189 namespace.getMetadata().getName(),
190 namespace.getStatus().getPhase(),
191 namespace.getMetadata() != null &&
192 namespace.getMetadata().getLabels() != null &&
193 !namespace.getMetadata().getLabels().isEmpty() ?
194 namespace.getMetadata().getLabels() : "");
195 }
196
Jian Lib1cd0b02019-02-21 16:41:40 +0900197 private void printService(io.fabric8.kubernetes.api.model.Service service) {
198
199 List<Integer> ports = Lists.newArrayList();
200
201 service.getSpec().getPorts().forEach(p -> ports.add(p.getPort()));
202
203 print(SERVICE_FORMAT,
204 service.getMetadata().getName(),
205 service.getSpec().getClusterIP(),
206 ports.isEmpty() ? "" : ports);
207 }
208
209 private void printPod(Pod pod) {
210
211 List<String> containers = Lists.newArrayList();
212
213 pod.getSpec().getContainers().forEach(c -> containers.add(c.getName()));
214
215 print(POD_FORMAT,
216 pod.getMetadata().getName(),
217 pod.getMetadata().getNamespace(),
218 pod.getStatus().getPodIP(),
219 containers.isEmpty() ? "" : containers);
220 }
Jian Li3d1111e2019-02-22 02:02:13 +0900221
Jian Lif4523d82019-07-07 01:06:09 +0900222 private void printNetworkPolicy(NetworkPolicy policy) {
223 print(NETWORK_POLICY_FORMAT,
224 policy.getMetadata().getName(),
225 policy.getMetadata().getNamespace(),
226 policy.getSpec().getPolicyTypes().isEmpty() ?
227 "" : policy.getSpec().getPolicyTypes());
228 }
Jian Lib1cd0b02019-02-21 16:41:40 +0900229}