Context("with valid CPI v1 input", func() {
		It("deletes a previously uploaded stemcell from the rackhd server", func() {
			apiServer, err := helpers.GetRackHDHost()
			Expect(err).ToNot(HaveOccurred())

			c := config.Cpi{ApiServer: apiServer}

			var createInput bosh.MethodArguments
			createInput = append(createInput, "../spec_assets/image")

			baseName, err := cpi.CreateStemcell(c, createInput)
			Expect(err).ToNot(HaveOccurred())

			var deleteInput bosh.MethodArguments
			deleteInput = append(deleteInput, baseName)
			err = cpi.DeleteStemcell(c, deleteInput)
			Expect(err).ToNot(HaveOccurred())

			url := fmt.Sprintf("%s/api/common/files/metadata/%s", c.ApiServer, baseName)
			resp, err := http.Get(url)
			Expect(err).ToNot(HaveOccurred())

			defer resp.Body.Close()
			Expect(resp.StatusCode).To(Equal(404))
		})
	})

	Context("with invalid CPI v1 input", func() {
		It("returns an error", func() {
			apiServer, err := helpers.GetRackHDHost()
			Expect(err).ToNot(HaveOccurred())
	Context("with valid CPI v1 input", func() {
		It("deletes a previously uploaded stemcell from the rackhd server", func() {
			apiServerIP := fmt.Sprintf("%s:8080", os.Getenv("RACKHD_API_URI"))
			Expect(apiServerIP).ToNot(BeEmpty())

			config := config.Cpi{ApiServer: apiServerIP}

			var createInput bosh.MethodArguments
			createInput = append(createInput, "../spec_assets/image")

			baseName, err := cpi.CreateStemcell(config, createInput)
			Expect(err).ToNot(HaveOccurred())

			var deleteInput bosh.MethodArguments
			deleteInput = append(deleteInput, baseName)
			err = cpi.DeleteStemcell(config, deleteInput)
			Expect(err).ToNot(HaveOccurred())

			url := fmt.Sprintf("http://%s/api/common/files/metadata/%s", config.ApiServer, baseName)
			resp, err := http.Get(url)
			Expect(err).ToNot(HaveOccurred())

			defer resp.Body.Close()
			Expect(resp.StatusCode).To(Equal(404))
		})
	})

	Context("with invalid CPI v1 input", func() {
		It("returns an error", func() {
			apiServerIP := fmt.Sprintf("%s:8080", os.Getenv("RACKHD_API_URI"))
			Expect(apiServerIP).ToNot(BeEmpty())
func main() {
	responseLogBuffer = new(bytes.Buffer)
	multiWriter := io.MultiWriter(os.Stderr, responseLogBuffer)
	logLevel := os.Getenv("RACKHD_CPI_LOG_LEVEL")
	log.SetOutput(multiWriter)

	switch logLevel {
	case "DEBUG":
		log.SetLevel(log.DebugLevel)
	case "INFO":
		log.SetLevel(log.InfoLevel)
	case "ERROR":
		log.SetLevel(log.ErrorLevel)
	case "FATAL":
		log.SetLevel(log.FatalLevel)
	default:
		log.SetLevel(log.DebugLevel)
	}

	configPath := flag.String("configPath", "", "Path to configuration file")
	flag.Parse()

	file, err := os.Open(*configPath)
	defer file.Close()

	if err != nil {
		log.Error(fmt.Sprintf("unable to open configuration file %s", err))
		exitWithDefaultError(err)
	}

	reqBytes, err := ioutil.ReadAll(os.Stdin)
	if err != nil {
		exitWithDefaultError(err)
	}

	req := bosh.CpiRequest{}
	err = json.Unmarshal(reqBytes, &req)
	if err != nil {
		exitWithDefaultError(err)
	}

	cpiConfig, err := config.New(file, req)
	if err != nil {
		exitWithDefaultError(err)
	}

	implemented, err := cpi.ImplementsMethod(req.Method)
	if err != nil {
		exitWithDefaultError(err)
	}

	if !implemented {
		exitWithNotImplementedError(fmt.Errorf("Method: %s is not implemented", req.Method))
	}

	switch req.Method {
	case bosh.CREATE_STEMCELL:
		cid, err := cpi.CreateStemcell(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running CreateStemcell: %s", err))
		}
		exitWithResult(cid)
	case bosh.CREATE_VM:
		vmcid, err := cpi.CreateVM(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running CreateVM: %s", err))
		}
		exitWithResult(vmcid)
	case bosh.DELETE_STEMCELL:
		err = cpi.DeleteStemcell(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running DeleteStemcell: %s", err))
		}
		exitWithResult("")
	case bosh.DELETE_VM:
		err = cpi.DeleteVM(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running DeleteVM: %s", err))
		}
		exitWithResult("")
	case bosh.SET_VM_METADATA:
		err := cpi.SetVMMetadata(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running SetVMMetadata: %s", err))
		}
		exitWithResult("")
	case bosh.HAS_VM:
		hasVM, err := cpi.HasVM(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running HasVM: %s", err))
		}
		exitWithResult(hasVM)
	case bosh.CREATE_DISK:
		diskCID, err := cpi.CreateDisk(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running CreateDisk: %s", err))
		}
		exitWithResult(diskCID)
	case bosh.DELETE_DISK:
		err := cpi.DeleteDisk(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running DeleteDisk: %s", err))
		}
		exitWithResult("")
	case bosh.ATTACH_DISK:
		err := cpi.AttachDisk(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running AttachDisk: %s", err))
		}
		exitWithResult("")
	case bosh.DETACH_DISK:
		err := cpi.DetachDisk(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running DetachDisk: %s", err))
		}
		exitWithResult("")
	case bosh.HAS_DISK:
		diskExists, err := cpi.HasDisk(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running HasDisk: %s", err))
		}
		exitWithResult(diskExists)
	case bosh.GET_DISKS:
		diskCIDs, err := cpi.GetDisks(cpiConfig, req.Arguments)
		if err != nil {
			exitWithDefaultError(fmt.Errorf("Error running GetDisks: %s", err))
		}
		exitWithResult(diskCIDs)
	default:
		exitWithDefaultError(fmt.Errorf("Unexpected command: %s dispatched...aborting", req.Method))
	}
}