// Shutdown stops the daemon. func (daemon *Daemon) Shutdown() error { daemon.shutdown = true if daemon.containers != nil { logrus.Debug("starting clean shutdown of all containers...") daemon.containers.ApplyAll(func(c *container.Container) { if !c.IsRunning() { return } logrus.Debugf("stopping %s", c.ID) if err := daemon.shutdownContainer(c); err != nil { logrus.Errorf("Stop container error: %v", err) return } logrus.Debugf("container stopped %s", c.ID) }) } // trigger libnetwork Stop only if it's initialized if daemon.netController != nil { daemon.netController.Stop() } if daemon.layerStore != nil { if err := daemon.layerStore.Cleanup(); err != nil { logrus.Errorf("Error during layer Store.Cleanup(): %v", err) } } if err := daemon.cleanupMounts(); err != nil { return err } return nil }
// Create a new flow on the table func (self *Table) NewFlow(match FlowMatch) (*Flow, error) { // modifications to flowdb requires a lock self.lock.Lock() defer self.lock.Unlock() flow := new(Flow) flow.Table = self flow.Match = match flow.isInstalled = false flow.FlowID = globalFlowID // FIXME: need a better id allocation globalFlowID += 1 flow.flowActions = make([]*FlowAction, 0) log.Debugf("Creating new flow for match: %+v", match) // See if the flow already exists flowKey := flow.flowKey() if self.flowDb[flowKey] != nil { log.Errorf("Flow %s already exists", flowKey) return nil, errors.New("Flow already exists") } log.Debugf("Added flow: %s", flowKey) // Save it in DB. We dont install the flow till its next graph elem is set self.flowDb[flowKey] = flow return flow, nil }
func releaseOSSboxResources(osSbox osl.Sandbox, ep *endpoint) { for _, i := range osSbox.Info().Interfaces() { // Only remove the interfaces owned by this endpoint from the sandbox. if ep.hasInterface(i.SrcName()) { if err := i.Remove(); err != nil { log.Debugf("Remove interface %s failed: %v", i.SrcName(), err) } } } ep.Lock() joinInfo := ep.joinInfo ep.Unlock() if joinInfo == nil { return } // Remove non-interface routes. for _, r := range joinInfo.StaticRoutes { if err := osSbox.RemoveStaticRoute(r); err != nil { log.Debugf("Remove route failed: %v", err) } } }
// Stdio returns the stdin, stdout, and stderr pipes, respectively. Closing // these pipes does not close the underlying pipes; it should be possible to // call this multiple times to get multiple interfaces. func (process *process) Stdio() (io.WriteCloser, io.ReadCloser, io.ReadCloser, error) { operation := "Stdio" title := "HCSShim::Process::" + operation logrus.Debugf(title+" processid=%d", process.processID) var stdIn, stdOut, stdErr syscall.Handle if process.cachedPipes == nil { var ( processInfo hcsProcessInformation resultp *uint16 ) err := hcsGetProcessInfo(process.handle, &processInfo, &resultp) err = processHcsResult(err, resultp) if err != nil { return nil, nil, nil, makeProcessError(process, operation, "", err) } stdIn, stdOut, stdErr = processInfo.StdInput, processInfo.StdOutput, processInfo.StdError } else { // Use cached pipes stdIn, stdOut, stdErr = process.cachedPipes.stdIn, process.cachedPipes.stdOut, process.cachedPipes.stdErr // Invalidate the cache process.cachedPipes = nil } pipes, err := makeOpenFiles([]syscall.Handle{stdIn, stdOut, stdErr}) if err != nil { return nil, nil, nil, err } logrus.Debugf(title+" succeeded processid=%d", process.processID) return pipes[0], pipes[1], pipes[2], nil }
// Close cleans up any state associated with the process but does not kill // or wait on it. func (process *process) Close() error { operation := "Close" title := "HCSShim::Process::" + operation logrus.Debugf(title+" processid=%d", process.processID) // Don't double free this if process.handle == 0 { return nil } if hcsCallbacksSupported { if err := process.unregisterCallback(); err != nil { return makeProcessError(process, operation, "", err) } } if err := hcsCloseProcess(process.handle); err != nil { return makeProcessError(process, operation, "", err) } process.handle = 0 logrus.Debugf(title+" succeeded processid=%d", process.processID) return nil }
func (d *Dispatcher) deleteDatastoreFiles(ds *object.Datastore, path string, force bool) (bool, error) { defer trace.End(trace.Begin(fmt.Sprintf("path %q, force %t", path, force))) // refuse to delete everything on the datstore, ignore force if path == "" { dsn, _ := ds.ObjectName(d.ctx) msg := fmt.Sprintf("refusing to remove datastore files for path \"\" on datastore %q", dsn) return false, errors.New(msg) } var empty bool dsPath := ds.Path(path) res, err := d.lsFolder(ds, dsPath) if err != nil { if !types.IsFileNotFound(err) { err = errors.Errorf("Failed to browse folder %q: %s", dsPath, err) return empty, err } log.Debugf("Folder %q is not found", dsPath) empty = true return empty, nil } if len(res.File) > 0 && !force { log.Debugf("Folder %q is not empty, leave it there", dsPath) return empty, nil } m := object.NewFileManager(ds.Client()) if err = d.deleteFilesIteratively(m, ds, dsPath); err != nil { return empty, err } return true, nil }
// ResizeConsole resizes the console of the process. func (process *process) ResizeConsole(width, height uint16) error { operation := "ResizeConsole" title := "HCSShim::Process::" + operation logrus.Debugf(title+" processid=%d", process.processID) modifyRequest := processModifyRequest{ Operation: modifyConsoleSize, ConsoleSize: &consoleSize{ Height: height, Width: width, }, } modifyRequestb, err := json.Marshal(modifyRequest) if err != nil { return err } modifyRequestStr := string(modifyRequestb) var resultp *uint16 err = hcsModifyProcess(process.handle, modifyRequestStr, &resultp) err = processHcsResult(err, resultp) if err != nil { return makeProcessError(process, operation, "", err) } logrus.Debugf(title+" succeeded processid=%d", process.processID) return nil }
// waitRemove blocks until either: // a) the device registered at <device_set_prefix>-<hash> is removed, // or b) the 10 second timeout expires. func (devices *DeviceSet) waitRemove(devname string) error { log.Debugf("[deviceset %s] waitRemove(%s)", devices.devicePrefix, devname) defer log.Debugf("[deviceset %s] waitRemove(%s) END", devices.devicePrefix, devname) i := 0 for ; i < 1000; i++ { devinfo, err := devicemapper.GetInfo(devname) if err != nil { // If there is an error we assume the device doesn't exist. // The error might actually be something else, but we can't differentiate. return nil } if i%100 == 0 { log.Debugf("Waiting for removal of %s: exists=%d", devname, devinfo.Exists) } if devinfo.Exists == 0 { break } devices.Unlock() time.Sleep(10 * time.Millisecond) devices.Lock() } if i == 1000 { return fmt.Errorf("Timeout while waiting for device %s to be removed", devname) } return nil }
// GetSized downloads the named meta file with the given size. A short body // is acceptable because in the case of timestamp.json, the size is a cap, // not an exact length. // If size is "NoSizeLimit", this corresponds to "infinite," but we cut off at a // predefined threshold "notary.MaxDownloadSize". func (s HTTPStore) GetSized(name string, size int64) ([]byte, error) { url, err := s.buildMetaURL(name) if err != nil { return nil, err } req, err := http.NewRequest("GET", url.String(), nil) if err != nil { return nil, err } resp, err := s.roundTrip.RoundTrip(req) if err != nil { return nil, NetworkError{Wrapped: err} } defer resp.Body.Close() if err := translateStatusToError(resp, name); err != nil { logrus.Debugf("received HTTP status %d when requesting %s.", resp.StatusCode, name) return nil, err } if size == NoSizeLimit { size = notary.MaxDownloadSize } if resp.ContentLength > size { return nil, ErrMaliciousServer{} } logrus.Debugf("%d when retrieving metadata for %s", resp.StatusCode, name) b := io.LimitReader(resp.Body, size) body, err := ioutil.ReadAll(b) if err != nil { return nil, err } return body, nil }
func (l *tarexporter) loadLayer(filename string, rootFS image.RootFS, id string, progressOutput progress.Output) (layer.Layer, error) { rawTar, err := os.Open(filename) if err != nil { logrus.Debugf("Error reading embedded tar: %v", err) return nil, err } defer rawTar.Close() inflatedLayerData, err := archive.DecompressStream(rawTar) if err != nil { return nil, err } defer inflatedLayerData.Close() if progressOutput != nil { fileInfo, err := os.Stat(filename) if err != nil { logrus.Debugf("Error statting file: %v", err) return nil, err } progressReader := progress.NewProgressReader(inflatedLayerData, progressOutput, fileInfo.Size(), stringid.TruncateID(id), "Loading layer") return l.ls.Register(progressReader, rootFS.ChainID()) } return l.ls.Register(inflatedLayerData, rootFS.ChainID()) }
func (devices *DeviceSet) AddDevice(hash, baseHash string) error { log.Debugf("[deviceset] AddDevice() hash=%s basehash=%s", hash, baseHash) defer log.Debugf("[deviceset] AddDevice(hash=%s basehash=%s) END", hash, baseHash) baseInfo, err := devices.lookupDevice(baseHash) if err != nil { return err } baseInfo.lock.Lock() defer baseInfo.lock.Unlock() devices.Lock() defer devices.Unlock() if info, _ := devices.lookupDevice(hash); info != nil { return fmt.Errorf("device %s already exists", hash) } if err := devices.createRegisterSnapDevice(hash, baseInfo); err != nil { return err } return nil }
func (d *Driver) Put(id string) error { // Protect the d.active from concurrent access d.Lock() defer d.Unlock() mount := d.active[id] if mount == nil { logrus.Debugf("Put on a non-mounted device %s", id) // but it might be still here if d.Exists(id) { mergedDir := path.Join(d.dir(id), "merged") err := syscall.Unmount(mergedDir, 0) if err != nil { logrus.Debugf("Failed to unmount %s overlay: %v", id, err) } } return nil } mount.count-- if mount.count > 0 { return nil } defer delete(d.active, id) if mount.mounted { err := syscall.Unmount(mount.path, 0) if err != nil { logrus.Debugf("Failed to unmount %s overlay: %v", id, err) } return err } return nil }
func makeHttpHandler(eng *engine.Engine, logging bool, localMethod string, localRoute string, handlerFunc HttpApiFunc, enableCors bool, dockerVersion version.Version) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // log the request log.Debugf("Calling %s %s", localMethod, localRoute) if logging { log.Infof("%s %s", r.Method, r.RequestURI) } if strings.Contains(r.Header.Get("User-Agent"), "Docker-Client/") { userAgent := strings.Split(r.Header.Get("User-Agent"), "/") if len(userAgent) == 2 && !dockerVersion.Equal(version.Version(userAgent[1])) { log.Debugf("Warning: client and server don't have the same version (client: %s, server: %s)", userAgent[1], dockerVersion) } } version := version.Version(mux.Vars(r)["version"]) if version == "" { version = api.APIVERSION } if enableCors { writeCorsHeaders(w, r) } if version.GreaterThan(api.APIVERSION) { http.Error(w, fmt.Errorf("client and server don't have same version (client : %s, server: %s)", version, api.APIVERSION).Error(), http.StatusNotFound) return } if err := handlerFunc(eng, version, w, r, mux.Vars(r)); err != nil { log.Errorf("Handler for %s %s returned error: %s", localMethod, localRoute, err) httpError(w, err) } } }
func (b *Bridge) setupBridge(externalPort string) error { la := netlink.NewLinkAttrs() la.Name = b.bridgeName bridge, _ := netlink.LinkByName(b.bridgeName) if bridge == nil { log.Debugf("Bridge %s does not exist ", b.bridgeName) out, err := exec.Command("ovs-vsctl", "add-br", b.bridgeName).CombinedOutput() if err != nil { log.Fatalf("Bridge %s creation failed been created. Resp: %s, err: %s", b.bridgeName, out, err) } log.Infof("Bridge %s has been created. Resp: %s", b.bridgeName, out) out, err = exec.Command("ovs-vsctl", "add-port", b.bridgeName, externalPort).CombinedOutput() if err != nil { log.Fatalf("Failed to add external port %s. Resp: %s, err: %s", externalPort, out, err) } log.Infof("External port %s has been added to %s. Resp: %s", externalPort, b.bridgeName, out) out, err = exec.Command("ifconfig", externalPort, "0.0.0.0").CombinedOutput() if err != nil { log.Fatalf("Failed to ip address of port %s. Resp: %s, err: %s", externalPort, out, err) } log.Infof("Ip address of port %s has been cleaned. Resp: %s", externalPort, out) return err } else { log.Debugf("Bridge %s already exsist", b.bridgeName) } return nil }
func compareByOrigin(path1, path2 *Path) *Path { // Select the best path based on origin attribute. // // IGP is preferred over EGP; EGP is preferred over Incomplete. // If both paths have same origin, we return None. log.Debugf("enter compareByOrigin") _, attribute1 := path1.getPathAttr(bgp.BGP_ATTR_TYPE_ORIGIN) _, attribute2 := path2.getPathAttr(bgp.BGP_ATTR_TYPE_ORIGIN) if attribute1 == nil || attribute2 == nil { log.WithFields(log.Fields{ "Topic": "Table", "Key": "compareByOrigin", "Origin1": attribute1, "Origin2": attribute2, }).Error("can't compare origin because it's not present") return nil } origin1, n1 := binary.Uvarint(attribute1.(*bgp.PathAttributeOrigin).Value) origin2, n2 := binary.Uvarint(attribute2.(*bgp.PathAttributeOrigin).Value) log.Debugf("compareByOrigin -- origin1: %d(%d), origin2: %d(%d)", origin1, n1, origin2, n2) // If both paths have same origins if origin1 == origin2 { return nil } else if origin1 < origin2 { return path1 } else { return path2 } }
func (daemon *Daemon) cleanupMountsFromReader(reader io.Reader, unmount func(target string) error) error { sc := bufio.NewScanner(reader) var errors []string for sc.Scan() { line := sc.Text() fields := strings.Fields(line) if strings.HasPrefix(fields[4], daemon.repository) { logrus.Debugf("Mount base: %v, repository %s", fields[4], daemon.repository) mnt := fields[4] mountBase := filepath.Base(mnt) if mountBase == "mqueue" || mountBase == "shm" { logrus.Debugf("Unmounting %v", mnt) if err := unmount(mnt); err != nil { logrus.Error(err) errors = append(errors, err.Error()) } } } } if err := sc.Err(); err != nil { return err } if len(errors) > 0 { return fmt.Errorf("Error cleaningup mounts:\n%v", strings.Join(errors, "\n")) } logrus.Debugf("Cleaning up old shm/mqueue mounts: done.") return nil }
func compareByMED(path1, path2 *Path) *Path { // Select the path based with lowest MED value. // // If both paths have same MED, return None. // By default, a route that arrives with no MED value is treated as if it // had a MED of 0, the most preferred value. // RFC says lower MED is preferred over higher MED value. // compare MED among not only same AS path but also all path, // like bgp always-compare-med log.Debugf("enter compareByMED") getMed := func(path *Path) uint32 { _, attribute := path.getPathAttr(bgp.BGP_ATTR_TYPE_MULTI_EXIT_DISC) if attribute == nil { return 0 } med := attribute.(*bgp.PathAttributeMultiExitDisc).Value return med } med1 := getMed(path1) med2 := getMed(path2) log.Debugf("compareByMED -- med1: %d, med2: %d", med1, med2) if med1 == med2 { return nil } else if med1 < med2 { return path1 } return path2 }
func findImages(cfg *config.CloudConfig) ([]string, error) { log.Debugf("Looking for images at %s", config.IMAGES_PATH) result := []string{} dir, err := os.Open(config.IMAGES_PATH) if os.IsNotExist(err) { log.Debugf("Not loading images, %s does not exist") return result, nil } if err != nil { return nil, err } defer dir.Close() files, err := dir.Readdirnames(0) if err != nil { return nil, err } for _, fileName := range files { if ok, _ := path.Match(config.IMAGES_PATTERN, fileName); ok { log.Debugf("Found %s", fileName) result = append(result, fileName) } } return result, nil }
func ecrImageExists(image *imagename.ImageName, auth docker.AuthConfiguration) (exists bool, err error) { var ( req *http.Request res *http.Response client = &http.Client{} ) uri := fmt.Sprintf("https://%s/v2/%s/manifests/%s", image.Registry, image.Name, image.Tag) if req, err = http.NewRequest("GET", uri, nil); err != nil { return false, err } req.SetBasicAuth(auth.Username, auth.Password) log.Debugf("Request ECR image %s with basic auth %s:****", uri, auth.Username) if res, err = client.Do(req); err != nil { return false, fmt.Errorf("Failed to authenticate by realm url %s, error %s", uri, err) } defer res.Body.Close() log.Debugf("Got status %d", res.StatusCode) if res.StatusCode == 404 { return false, nil } if res.StatusCode != 200 { // TODO: maybe more descriptive error return false, fmt.Errorf("GET %s status code %d", uri, res.StatusCode) } return true, nil }
func (c *Context) LoadEnv() (*rancherClient.Environment, error) { if c.Environment != nil { return c.Environment, nil } projectName := c.sanitizedProjectName() if _, err := c.loadClient(); err != nil { return nil, err } logrus.Debugf("Looking for stack %s", projectName) // First try by name envs, err := c.Client.Environment.List(&rancherClient.ListOpts{ Filters: map[string]interface{}{ "name": projectName, "removed_null": nil, }, }) if err != nil { return nil, err } for _, env := range envs.Data { if strings.EqualFold(projectName, env.Name) { logrus.Debugf("Found stack: %s(%s)", env.Name, env.Id) c.Environment = &env return c.Environment, nil } } // Now try not by name for case sensitive databases envs, err = c.Client.Environment.List(&rancherClient.ListOpts{ Filters: map[string]interface{}{ "removed_null": nil, }, }) if err != nil { return nil, err } for _, env := range envs.Data { if strings.EqualFold(projectName, env.Name) { logrus.Debugf("Found stack: %s(%s)", env.Name, env.Id) c.Environment = &env return c.Environment, nil } } logrus.Infof("Creating stack %s", projectName) env, err := c.Client.Environment.Create(&rancherClient.Environment{ Name: projectName, }) if err != nil { return nil, err } c.Environment = env return c.Environment, nil }
func (process *process) properties() (*processStatus, error) { operation := "properties" title := "HCSShim::Process::" + operation logrus.Debugf(title+" processid=%d", process.processID) var ( resultp *uint16 propertiesp *uint16 ) err := hcsGetProcessProperties(process.handle, &propertiesp, &resultp) err = processHcsResult(err, resultp) if err != nil { return nil, makeProcessError(process, operation, "", err) } if propertiesp == nil { return nil, errors.New("Unexpected result from hcsGetProcessProperties, properties should never be nil") } propertiesRaw := convertAndFreeCoTaskMemBytes(propertiesp) properties := &processStatus{} if err := json.Unmarshal(propertiesRaw, properties); err != nil { return nil, err } logrus.Debugf(title+" succeeded processid=%d, properties=%s", process.processID, propertiesRaw) return properties, nil }
func createDefaultNetwork(c libnetwork.NetworkController) { nw := c.Config().Daemon.DefaultNetwork d := c.Config().Daemon.DefaultDriver createOptions := []libnetwork.NetworkOption{} genericOption := options.Generic{} if nw != "" && d != "" { // Bridge driver is special due to legacy reasons if d == "bridge" { genericOption[netlabel.GenericData] = map[string]string{ "BridgeName": "docker0", "DefaultBridge": "true", } createOptions = append(createOptions, libnetwork.NetworkOptionGeneric(genericOption), ipamOption(nw)) } if n, err := c.NetworkByName(nw); err == nil { logrus.Debugf("Default network %s already present. Deleting it", nw) if err = n.Delete(); err != nil { logrus.Debugf("Network could not be deleted: %v", err) return } } _, err := c.NewNetwork(d, nw, createOptions...) if err != nil { logrus.Errorf("Error creating default network : %s : %v", nw, err) } } }
// CloseStdin closes the write side of the stdin pipe so that the process is // notified on the read side that there is no more data in stdin. func (process *process) CloseStdin() error { operation := "CloseStdin" title := "HCSShim::Process::" + operation logrus.Debugf(title+" processid=%d", process.processID) modifyRequest := processModifyRequest{ Operation: modifyCloseHandle, CloseHandle: &closeHandle{ Handle: stdIn, }, } modifyRequestb, err := json.Marshal(modifyRequest) if err != nil { return err } modifyRequestStr := string(modifyRequestb) var resultp *uint16 err = hcsModifyProcess(process.handle, modifyRequestStr, &resultp) err = processHcsResult(err, resultp) if err != nil { return makeProcessError(process, operation, "", err) } logrus.Debugf(title+" succeeded processid=%d", process.processID) return nil }
//fetch the request json from riak and parse the json to struct func (p *Payload) Convert() (*Requests, error) { log.Infof("get requests %s", p.Id) if p.CatId != "" { r := &Requests{ Id: p.Id, CatId: p.CatId, Action: p.Action, Category: p.Category, CreatedAt: p.CreatedAt, } log.Debugf("Requests %v", r) return r, nil } else { r := &Requests{} ops := ldb.Options{ TableName: "requests", Pks: []string{"Id"}, Ccms: []string{}, Hosts: meta.MC.Scylla, Keyspace: meta.MC.ScyllaKeyspace, PksClauses: map[string]interface{}{"Id": p.Id}, CcmsClauses: make(map[string]interface{}), } if err := ldb.Fetchdb(ops, r); err != nil { return nil, err } log.Debugf("Requests %v", r) return r, nil } }
// updateKeys allows to add a new key and/or change the primary key and/or prune an existing key // The primary key is the key used in transmission and will go in first position in the list. func (d *driver) updateKeys(newKey, primary, pruneKey *key) error { logrus.Debugf("Updating Keys. New: %v, Primary: %v, Pruned: %v", newKey, primary, pruneKey) logrus.Debugf("Current: %v", d.keys) var ( newIdx = -1 priIdx = -1 delIdx = -1 lIP = net.ParseIP(d.bindAddress) ) d.Lock() // add new if newKey != nil { d.keys = append(d.keys, newKey) newIdx += len(d.keys) } for i, k := range d.keys { if primary != nil && k.tag == primary.tag { priIdx = i } if pruneKey != nil && k.tag == pruneKey.tag { delIdx = i } } d.Unlock() if (newKey != nil && newIdx == -1) || (primary != nil && priIdx == -1) || (pruneKey != nil && delIdx == -1) { return types.BadRequestErrorf("cannot find proper key indices while processing key update:"+ "(newIdx,priIdx,delIdx):(%d, %d, %d)", newIdx, priIdx, delIdx) } d.secMapWalk(func(rIPs string, spis []*spi) ([]*spi, bool) { rIP := net.ParseIP(rIPs) return updateNodeKey(lIP, rIP, spis, d.keys, newIdx, priIdx, delIdx), false }) d.Lock() // swap primary if priIdx != -1 { swp := d.keys[0] d.keys[0] = d.keys[priIdx] d.keys[priIdx] = swp } // prune if delIdx != -1 { if delIdx == 0 { delIdx = priIdx } d.keys = append(d.keys[:delIdx], d.keys[delIdx+1:]...) } d.Unlock() logrus.Debugf("Updated: %v", d.keys) return nil }
// GetComputeSystemProperties gets the properties for the compute system with the given ID. func GetComputeSystemProperties(id string, flags uint32) (ComputeSystemProperties, error) { title := "hcsshim::GetComputeSystemProperties " csProps := ComputeSystemProperties{ Stopped: false, AreUpdatesPending: false, } logrus.Debugf("Calling proc") var buffer *uint16 err := getComputeSystemProperties(id, flags, &buffer) if err != nil { err = makeError(err, title, "") logrus.Error(err) return csProps, err } propData := convertAndFreeCoTaskMemString(buffer) logrus.Debugf(title+" - succeeded output=%s", propData) if err = json.Unmarshal([]byte(propData), &csProps); err != nil { logrus.Error(err) return csProps, err } return csProps, nil }
// importLayer adds a new layer to the tag and graph store based on the given data. func (d *Driver) importLayer(id string, layerData archive.Reader, parentLayerPaths []string) (size int64, err error) { layerFolder := d.dir(id) tempFolder := layerFolder + "-" + strconv.FormatUint(uint64(random.Rand.Uint32()), 10) if err = os.MkdirAll(tempFolder, 0755); err != nil { logrus.Errorf("Could not create %s %s", tempFolder, err) return } defer func() { _, folderName := filepath.Split(tempFolder) if err2 := hcsshim.DestroyLayer(d.info, folderName); err2 != nil { logrus.Warnf("Couldn't clean-up tempFolder: %s %s", tempFolder, err2) } }() start := time.Now().UTC() logrus.Debugf("Start untar layer") if size, err = chrootarchive.ApplyLayer(tempFolder, layerData); err != nil { return } logrus.Debugf("Untar time: %vs", time.Now().UTC().Sub(start).Seconds()) if err = hcsshim.ImportLayer(d.info, id, tempFolder, parentLayerPaths); err != nil { return } return }
func compareByASPath(path1, path2 *Path) *Path { // Calculated the best-paths by comparing as-path lengths. // // Shortest as-path length is preferred. If both path have same lengths, // we return None. log.Debugf("enter compareByASPath") _, attribute1 := path1.getPathAttr(bgp.BGP_ATTR_TYPE_AS_PATH) _, attribute2 := path2.getPathAttr(bgp.BGP_ATTR_TYPE_AS_PATH) if attribute1 == nil || attribute2 == nil { log.WithFields(log.Fields{ "Topic": "Table", "Key": "compareByASPath", "ASPath1": attribute1, "ASPath2": attribute2, }).Warn("can't compare ASPath because it's not present") } l1 := path1.GetAsPathLen() l2 := path2.GetAsPathLen() log.Debugf("compareByASPath -- l1: %d, l2: %d", l1, l2) if l1 > l2 { return path2 } else if l1 < l2 { return path1 } else { return nil } }
func validateEndpoint(endpoint *Endpoint) error { log.Debugf("pinging registry endpoint %s", endpoint) // Try HTTPS ping to registry endpoint.URL.Scheme = "https" if _, err := endpoint.Ping(); err != nil { if endpoint.IsSecure { // If registry is secure and HTTPS failed, show user the error and tell them about `--insecure-registry` // in case that's what they need. DO NOT accept unknown CA certificates, and DO NOT fallback to HTTP. return fmt.Errorf("invalid registry endpoint %s: %v. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry %s` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/%s/ca.crt", endpoint, err, endpoint.URL.Host, endpoint.URL.Host) } // If registry is insecure and HTTPS failed, fallback to HTTP. log.Debugf("Error from registry %q marked as insecure: %v. Insecurely falling back to HTTP", endpoint, err) endpoint.URL.Scheme = "http" var err2 error if _, err2 = endpoint.Ping(); err2 == nil { return nil } return fmt.Errorf("invalid registry endpoint %q. HTTPS attempt: %v. HTTP attempt: %v", endpoint, err, err2) } return nil }
// probeCache checks if `b.docker` implements builder.ImageCache and image-caching // is enabled (`b.UseCache`). // If so attempts to look up the current `b.image` and `b.runConfig` pair with `b.docker`. // If an image is found, probeCache returns `(true, nil)`. // If no image is found, it returns `(false, nil)`. // If there is any error, it returns `(false, err)`. func (b *Builder) probeCache() (bool, error) { c, ok := b.docker.(builder.ImageCache) if !ok || !b.UseCache || b.cacheBusted { return false, nil } cache, err := c.GetCachedImage(b.image, b.runConfig) if err != nil { return false, err } if len(cache) == 0 { logrus.Debugf("[BUILDER] Cache miss: %s", b.runConfig.Cmd) b.cacheBusted = true return false, nil } fmt.Fprintf(b.Stdout, " ---> Using cache\n") logrus.Debugf("[BUILDER] Use cached version: %s", b.runConfig.Cmd) b.image = string(cache) // TODO: remove once Commit can take a tag parameter. b.docker.Retain(b.id, b.image) b.activeImages = append(b.activeImages, b.image) return true, nil }