package resolver import ( "context" virtv1 "kubevirt.io/api/core/v1" "edge-infra.dev/pkg/edge/api/apierror" "edge-infra.dev/pkg/edge/api/graph/model" "edge-infra.dev/pkg/edge/api/middleware" chariotClientApi "edge-infra.dev/pkg/edge/chariot/client" edgeAgent "edge-infra.dev/pkg/edge/edgeagent/model" ) func (r *Resolver) UpdateKubeVirtualMachineViaChariot(ctx context.Context, virtualMachine *model.VirtualMachine, operation chariotClientApi.Operation) error { return r.updateKubeVirtualMachineViaChariot(ctx, virtualMachine, operation) } func (r *Resolver) updateKubeVirtualMachineViaChariot(ctx context.Context, virtualMachine *model.VirtualMachine, operation chariotClientApi.Operation) error { cluster, err := r.StoreClusterService.GetCluster(ctx, virtualMachine.ClusterEdgeID) if err != nil { return err } encodedKubeVM, err := r.VirtualMachineService.CreateDSDSKubeVirtualMachineCR(virtualMachine) if err != nil { return err } return r.sendChariotMessage(ctx, cluster.ProjectID, cluster.ClusterEdgeID, operation, encodedKubeVM) } // Check if virtual machine exists func (r *Resolver) checkVirtualMachineExists(ctx context.Context, clusterEdgeID, name, namespace string) error { vms, err := r.VirtualMachineStatusService.GetStatuses(ctx, &clusterEdgeID, &name, &namespace) if err != nil { return err } if len(vms) == 0 { return apierror.New("the virtual machine doesn't exist").SetOperationID(ctx) } return nil } // Builds edge agent notifications for virtual machines, used for vm stop/start/restart queries and live migration func (r *Resolver) buildVMEdgeAgentNotification(ctx context.Context, virtualMachines []*model.VirtualMachineMetadataInput, clusterEdgeID, eventType string) (*edgeAgent.NotificationMessage, error) { //get actor/user from context user := middleware.ForContext(ctx) notification := edgeAgent.NewNotificationMessage(). SetActor(user.Username). SetClusterEdgeID(clusterEdgeID) for _, vm := range virtualMachines { // Check Virtual machine status if err := r.checkVirtualMachineExists(ctx, clusterEdgeID, vm.Name, vm.Namespace); err != nil { return nil, err } //mapping virtual machine info to edge agent event event := edgeAgent.BuildEdgeAgentEvent(vm.Name, virtv1.VirtualMachineGroupVersionKind.Kind, vm.Namespace, eventType) notification.AddEvent(*event) } return notification, nil }