github.com/Equinix-Metal/virtlet@v1.5.2-0.20210807010419-342346535dc5/tests/integration/utils.go (about)

     1  /*
     2  Copyright 2016 Mirantis
     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  */
    16  
    17  package integration
    18  
    19  import (
    20  	"fmt"
    21  	"log"
    22  	"os"
    23  	"time"
    24  
    25  	libvirt "github.com/libvirt/libvirt-go"
    26  	libvirtxml "github.com/libvirt/libvirt-go-xml"
    27  
    28  	"github.com/Equinix-Metal/virtlet/pkg/libvirttools"
    29  	virtletutils "github.com/Equinix-Metal/virtlet/pkg/utils"
    30  )
    31  
    32  const (
    33  	maxTime    = 60
    34  	libvirtURI = "qemu:///system"
    35  )
    36  
    37  func waitForSocket(filepath string) error {
    38  	for i := 0; i < maxTime; i++ {
    39  		time.Sleep(1 * time.Second)
    40  		if _, err := os.Stat(filepath); err == nil {
    41  			return nil
    42  		}
    43  	}
    44  
    45  	return fmt.Errorf("Socket %s doesn't exist", filepath)
    46  }
    47  
    48  func getDomainUUID(podID string) string {
    49  	return virtletutils.NewUUID5(libvirttools.ContainerNsUUID, podID)
    50  }
    51  
    52  func defineDummyVolume(poolName, volName string) (func(), error) {
    53  	conn, err := libvirt.NewConnect(libvirtURI)
    54  	if err != nil {
    55  		return nil, err
    56  	}
    57  
    58  	pool, err := conn.LookupStoragePoolByName(poolName)
    59  	if err != nil {
    60  		return nil, fmt.Errorf("failed to lookup pool '%s': %v", poolName, err)
    61  	}
    62  
    63  	volume := &libvirtxml.StorageVolume{
    64  		Name:     volName,
    65  		Capacity: &libvirtxml.StorageVolumeSize{Unit: "bytes", Value: 1},
    66  	}
    67  
    68  	volXML, err := volume.Marshal()
    69  	if err != nil {
    70  		log.Panicf("XML marshaling: %v", err)
    71  	}
    72  
    73  	vol, err := pool.StorageVolCreateXML(volXML, 0)
    74  	return func() {
    75  		if vol == nil {
    76  			return
    77  		}
    78  		if err := vol.Delete(0); err != nil {
    79  			log.Printf("WARNING: failed to clean up volume %q in pool %q: %v", volName, poolName, err)
    80  		} else {
    81  			vol = nil
    82  		}
    83  	}, err
    84  }
    85  
    86  func undefDomain(domainName string) error {
    87  	conn, err := libvirt.NewConnect(libvirtURI)
    88  	if err != nil {
    89  		return err
    90  	}
    91  	domain, err := conn.LookupDomainByName(domainName)
    92  	if err != nil {
    93  		return fmt.Errorf("failed to lookup domain by name %q: %v", domainName, err)
    94  	}
    95  	if err := domain.Undefine(); err != nil {
    96  		return fmt.Errorf("failed to lookup domain by name %q: %v", domainName, err)
    97  	}
    98  	return nil
    99  }
   100  
   101  func defineDummyDomain() error {
   102  	return defineDummyDomainWithName("")
   103  }
   104  
   105  func defineDummyDomainWithName(domainName string) error {
   106  	if domainName == "" {
   107  		domainName = "dummy-" + virtletutils.NewUUID()
   108  	}
   109  
   110  	conn, err := libvirt.NewConnect(libvirtURI)
   111  	if err != nil {
   112  		return err
   113  	}
   114  
   115  	domain := &libvirtxml.Domain{
   116  		Name: domainName,
   117  		Type: "qemu",
   118  		OS: &libvirtxml.DomainOS{
   119  			Type: &libvirtxml.DomainOSType{Type: "hvm"},
   120  		},
   121  		Memory: &libvirtxml.DomainMemory{Value: 8192, Unit: "KiB"},
   122  	}
   123  
   124  	domainXML, err := domain.Marshal()
   125  	if err != nil {
   126  		log.Panicf("XML marshaling: %v", err)
   127  	}
   128  
   129  	_, err = conn.DomainDefineXML(domainXML)
   130  	return err
   131  }