// Generate test order and push them into a channel. func generateTestOrders(count int) KeyValueChan { articleMaxNo := 9999 unitPrices := make([]float64, articleMaxNo+1) for i := 0; i < articleMaxNo+1; i++ { unitPrices[i] = rand.Float64() * 100.0 } kvc := make(KeyValueChan) go func() { for i := 0; i < count; i++ { order := new(Order) order.OrderNo = identifier.NewUUID() order.CustomerNo = rand.Intn(999) + 1 order.Items = make([]*OrderItem, rand.Intn(9)+1) for j := 0; j < len(order.Items); j++ { articleNo := rand.Intn(articleMaxNo) order.Items[j] = &OrderItem{ ArticleNo: articleNo, Count: rand.Intn(9) + 1, UnitPrice: unitPrices[articleNo], DiscountPerc: rand.Float64() * 4.0, } } kvc <- &KeyValue{order.OrderNo.String(), order} } close(kvc) }() return kvc }
func (s *stepCreateDroplet) Run(state multistep.StateBag) multistep.StepAction { client := state.Get("client").(*DigitalOceanClient) ui := state.Get("ui").(packer.Ui) c := state.Get("config").(config) sshKeyId := state.Get("ssh_key_id").(uint) ui.Say("Creating droplet...") // Some random droplet name as it's temporary name := fmt.Sprintf("packer-%s", hex.EncodeToString(identifier.NewUUID().Raw())) // Create the droplet based on configuration dropletId, err := client.CreateDroplet(name, c.SizeID, c.ImageID, c.RegionID, sshKeyId) if err != nil { err := fmt.Errorf("Error creating droplet: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } // We use this in cleanup s.dropletId = dropletId // Store the droplet id for later state.Put("droplet_id", dropletId) return multistep.ActionContinue }
func (s *StepSecurityGroup) Run(state map[string]interface{}) multistep.StepAction { ec2conn := state["ec2"].(*ec2.EC2) ui := state["ui"].(packer.Ui) if s.SecurityGroupId != "" { log.Printf("Using specified security group: %s", s.SecurityGroupId) state["securityGroupId"] = s.SecurityGroupId return multistep.ActionContinue } if s.SSHPort == 0 { panic("SSHPort must be set to a non-zero value.") } // Create the group ui.Say("Creating temporary security group for this instance...") groupName := fmt.Sprintf("packer %s", hex.EncodeToString(identifier.NewUUID().Raw())) log.Printf("Temporary group name: %s", groupName) group := ec2.SecurityGroup{ Name: groupName, Description: "Temporary group for Packer", VpcId: s.VpcId, } groupResp, err := ec2conn.CreateSecurityGroup(group) if err != nil { ui.Error(err.Error()) return multistep.ActionHalt } // Set the group ID so we can delete it later s.createdGroupId = groupResp.Id // Authorize the SSH access perms := []ec2.IPPerm{ ec2.IPPerm{ Protocol: "tcp", FromPort: s.SSHPort, ToPort: s.SSHPort, SourceIPs: []string{"0.0.0.0/0"}, }, } ui.Say("Authorizing SSH access on the temporary security group...") if _, err := ec2conn.AuthorizeSecurityGroup(groupResp.SecurityGroup, perms); err != nil { err := fmt.Errorf("Error creating temporary security group: %s", err) state["error"] = err ui.Error(err.Error()) return multistep.ActionHalt } // Set some state data for use in future steps state["securityGroupId"] = s.createdGroupId return multistep.ActionContinue }
func (s *StepKeyPair) Run(state multistep.StateBag) multistep.StepAction { ec2conn := state.Get("ec2").(*ec2.EC2) ui := state.Get("ui").(packer.Ui) ui.Say("Creating temporary keypair for this instance...") keyName := fmt.Sprintf("packer %s", hex.EncodeToString(identifier.NewUUID().Raw())) log.Printf("temporary keypair name: %s", keyName) keyResp, err := ec2conn.CreateKeyPair(keyName) if err != nil { state.Put("error", fmt.Errorf("Error creating temporary keypair: %s", err)) return multistep.ActionHalt } // Set the keyname so we know to delete it later s.keyName = keyName // Set some state data for use in future steps state.Put("keyPair", keyName) state.Put("privateKey", keyResp.KeyMaterial) // If we're in debug mode, output the private key to the working // directory. if s.Debug { ui.Message(fmt.Sprintf("Saving key for debug purposes: %s", s.DebugKeyPath)) f, err := os.Create(s.DebugKeyPath) if err != nil { state.Put("error", fmt.Errorf("Error saving debug key: %s", err)) return multistep.ActionHalt } defer f.Close() // Write the key out if _, err := f.Write([]byte(keyResp.KeyMaterial)); err != nil { state.Put("error", fmt.Errorf("Error saving debug key: %s", err)) return multistep.ActionHalt } // Chmod it so that it is SSH ready if runtime.GOOS != "windows" { if err := f.Chmod(0600); err != nil { state.Put("error", fmt.Errorf("Error setting permissions of debug key: %s", err)) return multistep.ActionHalt } } } return multistep.ActionContinue }
func (s *stepCreateSSHKey) Run(state multistep.StateBag) multistep.StepAction { client := state.Get("client").(*DigitalOceanClient) ui := state.Get("ui").(packer.Ui) ui.Say("Creating temporary ssh key for droplet...") priv, err := rsa.GenerateKey(rand.Reader, 2014) // ASN.1 DER encoded form priv_der := x509.MarshalPKCS1PrivateKey(priv) priv_blk := pem.Block{ Type: "RSA PRIVATE KEY", Headers: nil, Bytes: priv_der, } // Set the private key in the statebag for later state.Put("privateKey", string(pem.EncodeToMemory(&priv_blk))) // Marshal the public key into SSH compatible format // TODO properly handle the public key error pub, _ := ssh.NewPublicKey(&priv.PublicKey) pub_sshformat := string(ssh.MarshalAuthorizedKey(pub)) // The name of the public key on DO name := fmt.Sprintf("packer-%s", hex.EncodeToString(identifier.NewUUID().Raw())) // Create the key! keyId, err := client.CreateKey(name, pub_sshformat) if err != nil { err := fmt.Errorf("Error creating temporary SSH key: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } // We use this to check cleanup s.keyId = keyId log.Printf("temporary ssh key name: %s", name) // Remember some state for the future state.Put("ssh_key_id", keyId) return multistep.ActionContinue }
func (s *stepSecurityGroup) Run(state map[string]interface{}) multistep.StepAction { config := state["config"].(config) ec2conn := state["ec2"].(*ec2.EC2) ui := state["ui"].(packer.Ui) // Create the group ui.Say("Creating temporary security group for this instance...") groupName := fmt.Sprintf("packer %s", hex.EncodeToString(identifier.NewUUID().Raw())) log.Printf("Temporary group name: %s", groupName) groupResp, err := ec2conn.CreateSecurityGroup(groupName, "Temporary group for Packer") if err != nil { ui.Error(err.Error()) return multistep.ActionHalt } // Set the group ID so we can delete it later s.groupId = groupResp.Id // Authorize the SSH access perms := []ec2.IPPerm{ ec2.IPPerm{ Protocol: "tcp", FromPort: config.SSHPort, ToPort: config.SSHPort, SourceIPs: []string{"0.0.0.0/0"}, }, } ui.Say("Authorizing SSH access on the temporary security group...") if _, err := ec2conn.AuthorizeSecurityGroup(groupResp.SecurityGroup, perms); err != nil { err := fmt.Errorf("Error creating temporary security group: %s", err) state["error"] = err ui.Error(err.Error()) return multistep.ActionHalt } // Set some state data for use in future steps state["securityGroupId"] = s.groupId return multistep.ActionContinue }
func (s *StepKeyPair) Run(state map[string]interface{}) multistep.StepAction { ec2conn := state["ec2"].(*ec2.EC2) ui := state["ui"].(packer.Ui) ui.Say("Creating temporary keypair for this instance...") keyName := fmt.Sprintf("packer %s", hex.EncodeToString(identifier.NewUUID().Raw())) log.Printf("temporary keypair name: %s", keyName) keyResp, err := ec2conn.CreateKeyPair(keyName) if err != nil { state["error"] = fmt.Errorf("Error creating temporary keypair: %s", err) return multistep.ActionHalt } // Set the keyname so we know to delete it later s.keyName = keyName // Set some state data for use in future steps state["keyPair"] = keyName state["privateKey"] = keyResp.KeyMaterial return multistep.ActionContinue }
func (s *StepKeyPair) Run(state map[string]interface{}) multistep.StepAction { csp := state["csp"].(gophercloud.CloudServersProvider) ui := state["ui"].(packer.Ui) ui.Say("Creating temporary keypair for this instance...") keyName := fmt.Sprintf("packer %s", hex.EncodeToString(identifier.NewUUID().Raw())) log.Printf("temporary keypair name: %s", keyName) keyResp, err := csp.CreateKeyPair(gophercloud.NewKeyPair{Name: keyName}) if err != nil { state["error"] = fmt.Errorf("Error creating temporary keypair: %s", err) return multistep.ActionHalt } // Set the keyname so we know to delete it later s.keyName = keyName // Set some state data for use in future steps state["keyPair"] = keyName state["privateKey"] = keyResp.PrivateKey return multistep.ActionContinue }