func (t *runBs) Run(job monsterqueue.Job) { params := job.Parameters() dockerEndpoint := params["endpoint"].(string) machineID := params["machine"].(string) node := cluster.Node{Address: dockerEndpoint} err := t.waitDocker(dockerEndpoint) if err != nil { job.Error(err) t.destroyMachine(machineID) return } rawMetadata := params["metadata"].(monsterqueue.JobParams) metadata := make(map[string]string, len(rawMetadata)) for key, value := range rawMetadata { metadata[key] = value.(string) } err = CreateContainer(dockerEndpoint, metadata["pool"], t.provisioner, true) if err != nil { node.CreationStatus = cluster.NodeCreationStatusError node.Metadata = map[string]string{"creationError": err.Error()} t.provisioner.Cluster().UpdateNode(node) job.Error(err) t.destroyMachine(machineID) return } node.CreationStatus = cluster.NodeCreationStatusCreated _, err = t.provisioner.Cluster().UpdateNode(node) if err != nil { job.Error(err) t.destroyMachine(machineID) return } job.Success(nil) }
func updateNodeHandler(w http.ResponseWriter, r *http.Request, t auth.Token) error { params, err := unmarshal(r.Body) if err != nil { return err } address, _ := params["address"] if address == "" { return &errors.HTTP{Code: http.StatusBadRequest, Message: "address is required"} } nodes, err := mainDockerProvisioner.Cluster().UnfilteredNodes() if err != nil { return err } var oldNode *cluster.Node for i := range nodes { if nodes[i].Address == address { oldNode = &nodes[i] break } } oldPool, _ := oldNode.Metadata["pool"] allowedOldPool := permission.Check(t, permission.PermNodeUpdate, permission.Context(permission.CtxPool, oldPool), ) if !allowedOldPool { return permission.ErrUnauthorized } newPool, ok := params["pool"] if ok { allowedNewPool := permission.Check(t, permission.PermNodeUpdate, permission.Context(permission.CtxPool, newPool), ) if !allowedNewPool { return permission.ErrUnauthorized } } delete(params, "address") node := cluster.Node{Address: address, Metadata: params} disabled, _ := strconv.ParseBool(r.URL.Query().Get("disabled")) enabled, _ := strconv.ParseBool(r.URL.Query().Get("enabled")) if disabled && enabled { return &errors.HTTP{ Code: http.StatusBadRequest, Message: "You can't make a node enable and disable at the same time.", } } if disabled { node.CreationStatus = cluster.NodeCreationStatusDisabled } if enabled { node.CreationStatus = cluster.NodeStatusReady } _, err = mainDockerProvisioner.Cluster().UpdateNode(node) return err }
func (p *dockerProvisioner) UpdateNode(opts provision.UpdateNodeOptions) error { node := cluster.Node{Address: opts.Address, Metadata: opts.Metadata} if opts.Disable { node.CreationStatus = cluster.NodeCreationStatusDisabled } if opts.Enable { node.CreationStatus = cluster.NodeCreationStatusCreated } _, err := mainDockerProvisioner.Cluster().UpdateNode(node) if err == clusterStorage.ErrNoSuchNode { return provision.ErrNodeNotFound } return err }
func (t *runBs) Run(job monsterqueue.Job) { params := job.Parameters() dockerEndpoint := params["endpoint"].(string) node := cluster.Node{Address: dockerEndpoint} err := t.waitDocker(dockerEndpoint) if err != nil { job.Error(err) return } node.CreationStatus = cluster.NodeCreationStatusCreated rawMetadata := params["metadata"].(monsterqueue.JobParams) metadata := make(map[string]string, len(rawMetadata)) for key, value := range rawMetadata { metadata[key] = value.(string) } err = createContainer(dockerEndpoint, metadata["pool"], t.provisioner, true) if err != nil { t.provisioner.Cluster().UpdateNode(node) job.Error(err) return } node.Metadata = map[string]string{"LastSuccess": time.Now().Format(time.RFC3339)} _, err = t.provisioner.Cluster().UpdateNode(node) if err != nil { job.Error(err) return } job.Success(nil) }
func updateNodeHandler(w http.ResponseWriter, r *http.Request, t auth.Token) error { params, err := unmarshal(r.Body) if err != nil { return err } address, _ := params["address"] if address == "" { return &errors.HTTP{Code: http.StatusBadRequest, Message: "address is required"} } delete(params, "address") node := cluster.Node{Address: address, Metadata: params} disabled, _ := strconv.ParseBool(r.URL.Query().Get("disabled")) if disabled { node.CreationStatus = cluster.NodeCreationStatusDisabled } _, err = mainDockerProvisioner.Cluster().UpdateNode(node) return err }