blob: 91ba18e9a88c443dc2fdcc7841e2476e31530cb5 [file] [log] [blame]
/*
* Copyright 2021-present Open Networking Foundation
*
* 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.onosproject.kubevirtnode.cli;
import io.fabric8.kubernetes.api.model.Node;
import io.fabric8.kubernetes.client.KubernetesClient;
import org.apache.karaf.shell.api.action.Command;
import org.apache.karaf.shell.api.action.lifecycle.Service;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.kubevirtnode.api.KubevirtApiConfig;
import org.onosproject.kubevirtnode.api.KubevirtApiConfigService;
import org.onosproject.kubevirtnode.api.KubevirtNode;
import org.onosproject.kubevirtnode.api.KubevirtNodeAdminService;
import java.util.Set;
import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.WORKER;
import static org.onosproject.kubevirtnode.api.KubevirtNodeState.INIT;
import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.buildKubevirtNode;
import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.k8sClient;
/**
* Synchronizes kubevirt node states.
*/
@Service
@Command(scope = "onos", name = "kubevirt-sync-state",
description = "Synchronizes kubevirt node states.")
public class KubevirtSyncStateCommand extends AbstractShellCommand {
@Override
protected void doExecute() throws Exception {
KubevirtApiConfigService apiConfigService = get(KubevirtApiConfigService.class);
print("Re-synchronizing Kubevirt node states..");
KubevirtApiConfig config = apiConfigService.apiConfig();
bootstrapKubevirtNodes(config);
print("Done.");
}
private void bootstrapKubevirtNodes(KubevirtApiConfig config) {
KubevirtNodeAdminService nodeAdminService = get(KubevirtNodeAdminService.class);
Set<KubevirtNode> completeNodeSet = nodeAdminService.completeNodes();
KubernetesClient k8sClient = k8sClient(config);
if (k8sClient == null) {
log.warn("Failed to connect to kubernetes API server");
return;
}
for (Node node : k8sClient.nodes().list().getItems()) {
KubevirtNode kubevirtNode = buildKubevirtNode(node);
// we always provision VMs to worker nodes, so only need to install
// flow rules in worker nodes
if (kubevirtNode.type() == WORKER) {
if (completeNodeSet.stream().map(KubevirtNode::hostname)
.filter(name -> name.equals(kubevirtNode.hostname()))
.findAny().isPresent()) {
print("Initializing %s because the node was COMPLETE state.",
kubevirtNode.hostname());
KubevirtNode updated = kubevirtNode.updateState(INIT);
nodeAdminService.updateNode(updated);
} else {
nodeAdminService.updateNode(kubevirtNode);
}
}
}
}
}