| package agent |
| |
| import ( |
| "github.com/docker/swarmkit/api" |
| "golang.org/x/net/context" |
| ) |
| |
| type resourceAllocator struct { |
| agent *Agent |
| } |
| |
| // ResourceAllocator is an interface to allocate resource such as |
| // network attachments from a worker node. |
| type ResourceAllocator interface { |
| // AttachNetwork creates a network attachment in the manager |
| // given a target network and a unique ID representing the |
| // connecting entity and optionally a list of ipv4/ipv6 |
| // addresses to be assigned to the attachment. AttachNetwork |
| // returns a unique ID for the attachment if successful or an |
| // error in case of failure. |
| AttachNetwork(ctx context.Context, id, target string, addresses []string) (string, error) |
| |
| // DetachNetworks deletes a network attachment for the passed |
| // attachment ID. The attachment ID is obtained from a |
| // previous AttachNetwork call. |
| DetachNetwork(ctx context.Context, aID string) error |
| } |
| |
| // AttachNetwork creates a network attachment. |
| func (r *resourceAllocator) AttachNetwork(ctx context.Context, id, target string, addresses []string) (string, error) { |
| var taskID string |
| if err := r.agent.withSession(ctx, func(session *session) error { |
| client := api.NewResourceAllocatorClient(session.conn.ClientConn) |
| r, err := client.AttachNetwork(ctx, &api.AttachNetworkRequest{ |
| Config: &api.NetworkAttachmentConfig{ |
| Target: target, |
| Addresses: addresses, |
| }, |
| ContainerID: id, |
| }) |
| if err != nil { |
| return err |
| } |
| taskID = r.AttachmentID |
| return nil |
| }); err != nil { |
| return "", err |
| } |
| |
| return taskID, nil |
| } |
| |
| // DetachNetwork deletes a network attachment. |
| func (r *resourceAllocator) DetachNetwork(ctx context.Context, aID string) error { |
| return r.agent.withSession(ctx, func(session *session) error { |
| client := api.NewResourceAllocatorClient(session.conn.ClientConn) |
| _, err := client.DetachNetwork(ctx, &api.DetachNetworkRequest{ |
| AttachmentID: aID, |
| }) |
| |
| return err |
| }) |
| } |
| |
| // ResourceAllocator provides an interface to access resource |
| // allocation methods such as AttachNetwork and DetachNetwork. |
| func (a *Agent) ResourceAllocator() ResourceAllocator { |
| return &resourceAllocator{agent: a} |
| } |