Ejemplo n.º 1
0
//PutImageLayerV1Handler is save image layer file in the server.
func PutImageLayerV1Handler(ctx *macaron.Context) (int, []byte) {
	//TODO: If standalone == true, Dockyard will check HEADER Authorization; if standalone == false, Dockyard will check HEADER TOEKN.
	imageID := ctx.Params(":image")

	basePath := setting.DockerV1Storage
	imagePath := fmt.Sprintf("%s/images/%s", basePath, imageID)
	layerfile := fmt.Sprintf("%s/images/%s/%s", basePath, imageID, imageID)

	if !utils.IsDirExist(imagePath) {
		os.MkdirAll(imagePath, os.ModePerm)
	}

	if _, err := os.Stat(layerfile); err == nil {
		os.Remove(layerfile)
	}

	if file, err := os.Create(layerfile); err != nil {
		log.Errorf("[%s] Create image file error: %s", ctx.Req.RequestURI, err.Error())

		result, _ := json.Marshal(map[string]string{"message": "Write Image File Error."})
		return http.StatusBadRequest, result
	} else {
		io.Copy(file, ctx.Req.Request.Body)
	}

	size, _ := utils.GetFileSize(layerfile)

	image := new(models.DockerImageV1)
	if err := image.PutLayer(imageID, layerfile, size); err != nil {
		log.Errorf("[%s] Failed to save image layer data error: %s", ctx.Req.RequestURI, err.Error())

		result, _ := json.Marshal(map[string]string{"message": "Put Image Layer Data Error"})
		return http.StatusBadRequest, result
	}

	result, _ := json.Marshal(map[string]string{})
	return http.StatusOK, result
}