Skip to content

Commit

Permalink
Add CNI plugins as system package
Browse files Browse the repository at this point in the history
Part of the changes in: #654

Tested on a Linux AMD64 host, downloaded as expected.

Signed-off-by: Alex Ellis (OpenFaaS Ltd) <alexellis2@gmail.com>
  • Loading branch information
alexellis committed Jun 29, 2022
1 parent 9ce4b81 commit 3380df2
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 15 deletions.
125 changes: 125 additions & 0 deletions cmd/system/cni.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
// Copyright (c) arkade author(s) 2022. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

package system

import (
"fmt"
"os"
"path"
"strings"

"github.com/alexellis/arkade/pkg/archive"
"github.com/alexellis/arkade/pkg/env"
"github.com/alexellis/arkade/pkg/get"
"github.com/spf13/cobra"
)

func MakeInstallCNI() *cobra.Command {

command := &cobra.Command{
Use: "cni",
Short: "Install CNI plugins",
Long: `Install CNI plugins for use with faasd, CNI, Kubernetes, etc.`,
Example: ` arkade system install cni
arkade system install cni --version v1.0.0`,
SilenceUsage: true,
}

command.Flags().StringP("version", "v", "v0.8.5", "The version for CNI to install")
command.Flags().StringP("path", "p", "/opt/cni/bin/", "Installation path, where a go subfolder will be created")
command.Flags().Bool("progress", true, "Show download progress")

command.RunE = func(cmd *cobra.Command, args []string) error {
installPath, _ := cmd.Flags().GetString("path")
version, _ := cmd.Flags().GetString("version")
progress, _ := cmd.Flags().GetBool("progress")

owner := "containernetworking"
repo := "plugins"

fmt.Printf("Installing CNI to %s\n", installPath)

if err := os.MkdirAll(installPath, 0755); err != nil && !os.IsExist(err) {
fmt.Printf("Error creating directory %s, error: %s\n", installPath, err.Error())
}

arch, osVer := env.GetClientArch()

if strings.ToLower(osVer) != "linux" {
return fmt.Errorf("this app only supports Linux")
}

if arch != "x86_64" && arch != "aarch64" {
return fmt.Errorf("this app only supports x86_64 and aarch64 and not %s", arch)
}
dlArch := arch
if arch == "x86_64" {
dlArch = "amd64"
} else if arch == "aarch64" {
dlArch = "arm64"
} else if arch == "armv7" || arch == "armv7l" {
dlArch = "armv6l"
}
if version == githubLatest {
v, err := get.FindGitHubRelease(owner, repo)
if err != nil {
return err
}

version = v
} else if !strings.HasPrefix(version, "v") {
version = "v" + version
}

fmt.Printf("Installing version: %s for: %s\n", version, dlArch)

filename := fmt.Sprintf("cni-plugins-linux-%s-%s.tgz", dlArch, version)
dlURL := fmt.Sprintf(githubDownloadTemplate, owner, repo, version, filename)

fmt.Printf("Downloading from: %s\n", dlURL)
outPath, err := get.DownloadFileP(dlURL, progress)
if err != nil {
return err
}
fmt.Printf("Downloaded to: %s\n", outPath)

f, err := os.OpenFile(outPath, os.O_RDONLY, 0644)
if err != nil {
return err
}
defer f.Close()

tempUnpackPath, err := os.MkdirTemp(os.TempDir(), "cni-plugins*")
if err != nil {
return err
}
defer os.RemoveAll(tempUnpackPath)

fmt.Printf("Unpacking CNI Plugins to: %s\n", tempUnpackPath)
if err := archive.Untar(f, tempUnpackPath, true); err != nil {
return err
}

dirs, err := os.ReadDir(tempUnpackPath)
if err != nil {
return err
}

for _, dir := range dirs {
if !dir.IsDir() {
src := path.Join(tempUnpackPath, dir.Name())
dst := path.Join(installPath, dir.Name())
fmt.Printf("Copying %s to: %s\n", src, dst)

if _, err := get.CopyFile(src, dst); err != nil {
return fmt.Errorf("unable to copy %s to %s, error: %s", src, dst, err)
}
}
}

return nil
}

return command
}
19 changes: 7 additions & 12 deletions cmd/system/firecracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,6 @@ const (

firecrackerOwner = "firecracker-microvm"
firecrackerRepo = "firecracker"

repoFlagName = "repo"
versionFlagName = "version"
pathFlagName = "path"
progressFlagName = "progress"
)

func MakeInstallFirecracker() *cobra.Command {
Expand All @@ -38,14 +33,14 @@ func MakeInstallFirecracker() *cobra.Command {
SilenceUsage: true,
}

command.Flags().StringP(versionFlagName, "v", githubLatest, "The version for Firecracker to install")
command.Flags().StringP(pathFlagName, "p", "/usr/local/bin", "Installation path, where a go subfolder will be created")
command.Flags().Bool(progressFlagName, true, "Show download progress")
command.Flags().StringP("version", "v", githubLatest, "The version for Firecracker to install")
command.Flags().StringP("path", "p", "/usr/local/bin", "Installation path, where a go subfolder will be created")
command.Flags().Bool("progress", true, "Show download progress")

command.RunE = func(cmd *cobra.Command, args []string) error {
installPath, _ := cmd.Flags().GetString(pathFlagName)
version, _ := cmd.Flags().GetString(versionFlagName)
progress, _ := cmd.Flags().GetBool(progressFlagName)
installPath, _ := cmd.Flags().GetString("path")
version, _ := cmd.Flags().GetString("version")
progress, _ := cmd.Flags().GetBool("progress")

fmt.Printf("Installing Firecracker to %s\n", installPath)

Expand Down Expand Up @@ -107,7 +102,7 @@ func MakeInstallFirecracker() *cobra.Command {
fmt.Sprintf("%s/jailer-%s-%s", tempUnpackPath, version, arch): fmt.Sprintf("%s/jailer", installPath),
}
for src, dst := range filesToCopy {
if _, copyErr := get.CopyFile(src, dst); copyErr != nil {
if _, err := get.CopyFile(src, dst); err != nil {
return err
}
}
Expand Down
1 change: 1 addition & 0 deletions cmd/system/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ func MakeInstall() *cobra.Command {
command.AddCommand(MakeInstallGo())
command.AddCommand(MakeInstallFirecracker())
command.AddCommand(MakeInstallPrometheus())
command.AddCommand(MakeInstallCNI())

return command
}
8 changes: 5 additions & 3 deletions cmd/system/prometheus.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ package system

import (
"fmt"
"os"
"strings"

"github.com/alexellis/arkade/pkg/archive"
"github.com/alexellis/arkade/pkg/env"
"github.com/alexellis/arkade/pkg/get"
"github.com/spf13/cobra"
"os"
"strings"
)

const (
Expand Down Expand Up @@ -95,6 +96,7 @@ func MakeInstallPrometheus() *cobra.Command {
return err
}
defer os.RemoveAll(tempUnpackPath)

fmt.Printf("Unpacking binaries to: %s\n", tempUnpackPath)
if err := archive.Untar(f, tempUnpackPath, true); err != nil {
return err
Expand All @@ -106,7 +108,7 @@ func MakeInstallPrometheus() *cobra.Command {
fmt.Sprintf("%s/%s", tempUnpackPath, promtool): fmt.Sprintf("%s/%s", installPath, promtool),
}
for src, dst := range filesToCopy {
if _, copyErr := get.CopyFile(src, dst); copyErr != nil {
if _, err := get.CopyFile(src, dst); err != nil {
return err
}
}
Expand Down

0 comments on commit 3380df2

Please sign in to comment.