github.com/masahide/goansible@v0.0.0-20160116054156-01eac649e9f2/task.go (about)

     1  package goansible
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  type Task struct {
     9  	Play *Play
    10  	//File string
    11  
    12  	data TaskData
    13  	cmd  string
    14  	args string
    15  	Vars Vars
    16  
    17  	IncludeVars Vars
    18  	Paths       Paths
    19  }
    20  
    21  type TaskData map[string]interface{}
    22  
    23  type Tasks []*Task
    24  
    25  func AdhocTask(cmd, args string) *Task {
    26  	return &Task{
    27  		cmd:  cmd,
    28  		args: args,
    29  		data: TaskData{"name": "adhoc"},
    30  		Vars: make(Vars),
    31  	}
    32  }
    33  
    34  var cOptions = []string{
    35  	"name", "action", "notify", "async", "poll",
    36  	"when", "future", "register", "with_items",
    37  }
    38  
    39  func (t *Task) Init(env *Environment) error {
    40  	t.Vars = make(Vars)
    41  
    42  	for k, v := range t.data {
    43  		found := false
    44  
    45  		for _, i := range cOptions {
    46  			if k == i {
    47  				found = true
    48  				break
    49  			}
    50  		}
    51  
    52  		if !found {
    53  			if t.cmd != "" {
    54  				return fmt.Errorf("Duplicate command '%s', already: %s", k, t.cmd)
    55  			}
    56  
    57  			t.cmd = k
    58  			if m, ok := v.(map[interface{}]interface{}); ok {
    59  				for ik, iv := range m {
    60  					t.Vars[fmt.Sprintf("%v", ik)] = Any(iv)
    61  				}
    62  			} else {
    63  				t.args = fmt.Sprintf("%v", v)
    64  			}
    65  		}
    66  	}
    67  
    68  	if t.cmd == "" {
    69  		act, ok := t.data["action"]
    70  		if !ok {
    71  			return fmt.Errorf("No action specified")
    72  		}
    73  
    74  		parts := strings.SplitN(fmt.Sprintf("%v", act), " ", 2)
    75  
    76  		t.cmd = parts[0]
    77  
    78  		if len(parts) == 2 {
    79  			t.args = parts[1]
    80  		}
    81  	}
    82  
    83  	t.Paths = env.Paths
    84  
    85  	return nil
    86  }
    87  
    88  func (t *Task) Command() string {
    89  	return t.cmd
    90  }
    91  
    92  func (t *Task) Args() string {
    93  	return t.args
    94  }
    95  
    96  func (t *Task) Name() string {
    97  	return t.data["name"].(string)
    98  }
    99  
   100  func (t *Task) Register() string {
   101  	if v, ok := t.data["register"]; ok {
   102  		return v.(string)
   103  	}
   104  
   105  	return ""
   106  }
   107  
   108  func (t *Task) Future() string {
   109  	if v, ok := t.data["future"]; ok {
   110  		return v.(string)
   111  	}
   112  
   113  	return ""
   114  }
   115  
   116  func (t *Task) When() string {
   117  	if v, ok := t.data["when"]; ok {
   118  		return v.(string)
   119  	}
   120  
   121  	return ""
   122  }
   123  
   124  func (t *Task) Notify() []string {
   125  	var v interface{}
   126  	var ok bool
   127  
   128  	if v, ok = t.data["notify"]; !ok {
   129  		return nil
   130  	}
   131  
   132  	var list []interface{}
   133  
   134  	if list, ok = v.([]interface{}); !ok {
   135  		return nil
   136  	}
   137  
   138  	out := make([]string, len(list))
   139  
   140  	for i, x := range list {
   141  		out[i] = x.(string)
   142  	}
   143  
   144  	return out
   145  }
   146  
   147  func (t *Task) Async() bool {
   148  	_, ok := t.data["async"]
   149  
   150  	return ok
   151  }
   152  
   153  func (t *Task) Items() []interface{} {
   154  	if v, ok := t.data["with_items"]; ok {
   155  		if a, ok := v.([]interface{}); ok {
   156  			return a
   157  		}
   158  	}
   159  
   160  	return nil
   161  }