github.com/kubernetes-incubator/kube-aws@v0.16.4/provisioner/remote_file_loader.go (about)

     1  package provisioner
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"os"
     9  	"path/filepath"
    10  
    11  	"github.com/kubernetes-incubator/kube-aws/logger"
    12  )
    13  
    14  type RemoteFileLoader struct {
    15  }
    16  
    17  func (loader *RemoteFileLoader) Load(f RemoteFileSpec) (*RemoteFile, error) {
    18  	loaded := NewRemoteFile(f)
    19  	logger.Debugf("RemoteFileLoader.Load(): loaded RemoteFile: %+v", loaded)
    20  
    21  	path := f.Source.Path
    22  
    23  	// TODO
    24  	cachePath := path
    25  
    26  	if path != "" {
    27  		if f.Type == "credential" {
    28  			path = path + ".enc"
    29  		} else {
    30  			if _, err := os.Stat(path); os.IsNotExist(err) {
    31  				if f.URL != "" {
    32  					fmt.Fprintf(os.Stderr, "downloading %s\n", f.URL)
    33  					err := download(f.URL, cachePath)
    34  					if err != nil {
    35  						return nil, fmt.Errorf("failed downloading %s: %v", f.URL, err)
    36  					}
    37  					mode := f.FileMode()
    38  					if mode != nil {
    39  						if err := os.Chmod(cachePath, *mode); err != nil {
    40  							return nil, fmt.Errorf("failed to chmod %s: %v", path, err)
    41  						}
    42  					}
    43  				} else if len(f.Content.String()) > 0 {
    44  					err := ioutil.WriteFile(cachePath, f.Content.bytes, *f.FileMode())
    45  					if err != nil {
    46  						return nil, fmt.Errorf("failed to write %s: %v", cachePath, err)
    47  					}
    48  				} else {
    49  					return nil, fmt.Errorf("%s not found", path)
    50  				}
    51  			}
    52  		}
    53  
    54  		data, err := ioutil.ReadFile(path)
    55  		if err != nil {
    56  			return nil, fmt.Errorf("failed loading %s: %v", path, err)
    57  		}
    58  
    59  		loaded.Content = NewBinaryContent(data)
    60  	} else {
    61  		if f.Template != "" {
    62  			loaded.Content = NewStringContent(f.Template)
    63  		} else {
    64  			loaded.Content = f.Content
    65  		}
    66  	}
    67  
    68  	logger.Debugf("RemoteFileLoader.String(): returning loaded remoteFile: %+v", loaded)
    69  	return loaded, nil
    70  }
    71  
    72  func download(url string, dest string) error {
    73  	dir := filepath.Dir(dest)
    74  	if err := os.MkdirAll(dir, 0700); err != nil {
    75  		return fmt.Errorf("failed creating dir %s: %v", dir, err)
    76  	}
    77  	out, err := os.Create(dest)
    78  	if err != nil {
    79  		return err
    80  	}
    81  	defer out.Close()
    82  
    83  	resp, err := http.Get(url)
    84  	if err != nil {
    85  		return err
    86  	}
    87  	defer resp.Body.Close()
    88  
    89  	_, err = io.Copy(out, resp.Body)
    90  	if err != nil {
    91  		return err
    92  	}
    93  
    94  	return nil
    95  }