github.com/jlmeeker/kismatic@v1.10.1-0.20180612190640-57f9005a1f1a/pkg/inspector/check/package.go (about)

     1  package check
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  // PackageQuery is a query for finding a package
     9  type PackageQuery struct {
    10  	Name    string
    11  	Version string
    12  }
    13  
    14  func (p PackageQuery) String() string {
    15  	return fmt.Sprintf("%s %s", p.Name, p.Version)
    16  }
    17  
    18  // The PackageCheck uses the operating system to determine whether a
    19  // package is installed.
    20  type PackageCheck struct {
    21  	PackageQuery               PackageQuery
    22  	PackageManager             PackageManager
    23  	InstallationDisabled       bool
    24  	DockerInstallationDisabled bool
    25  	DisconnectedInstallation   bool
    26  }
    27  
    28  // Check verifies a package is installed or in some cases available.
    29  // If DockerInstallationDisabled and a package contains "docker" always return true.
    30  // If InstallationDisabled, packages must be istalled. If packages are not isntalled
    31  // check if available and give useful feedback.
    32  // If DisconnectedInstallation, packages must be either installed or available.
    33  func (c PackageCheck) Check() (bool, error) {
    34  	// When docker installation is disabled do not check for any packages that contain "docker" in the name.
    35  	// The package name could be different, we will only validate the docker executable is present.
    36  	if c.DockerInstallationDisabled && strings.Contains(c.PackageQuery.Name, "docker") {
    37  		return true, nil
    38  	}
    39  	// All packages need to be installed when installation is disabled
    40  	if c.InstallationDisabled {
    41  		installed, err := c.PackageManager.IsInstalled(c.PackageQuery)
    42  		if err != nil {
    43  			return false, fmt.Errorf("failed to determine if package is installed: %v", err)
    44  		}
    45  		if installed {
    46  			return true, nil
    47  		}
    48  		// We check to see if it's available to give useful feedback to the user
    49  		available, err := c.PackageManager.IsAvailable(c.PackageQuery)
    50  		if err != nil {
    51  			return false, fmt.Errorf("failed to determine if package is available for install: %v", err)
    52  		}
    53  		if !available {
    54  			return false, fmt.Errorf("package is not installed, and is not available in known package repositories")
    55  		}
    56  		return false, fmt.Errorf("package is not installed, but is available in a package repository")
    57  	}
    58  	// Packages need to be available when disconnected installation
    59  	if c.DisconnectedInstallation {
    60  		installed, err := c.PackageManager.IsInstalled(c.PackageQuery)
    61  		if err != nil {
    62  			return false, fmt.Errorf("failed to determine if package is installed: %v", err)
    63  		}
    64  		if err != nil {
    65  			return false, fmt.Errorf("failed to determine if package is available for install: %v", err)
    66  		}
    67  		if installed {
    68  			return true, nil
    69  		}
    70  		available, err := c.PackageManager.IsAvailable(c.PackageQuery)
    71  		if err != nil {
    72  			return false, fmt.Errorf("failed to determine if package is available for install: %v", err)
    73  		}
    74  		if !available {
    75  			return false, fmt.Errorf("package is not installed, and is not available in known package repositories")
    76  		}
    77  		return true, nil
    78  	}
    79  	return true, nil
    80  }