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 }