github.com/go-chef/chef@v0.30.1/testapi/search.go (about)

     1  package testapi
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"os"
     7  	"time"
     8  
     9  	"github.com/go-chef/chef"
    10  )
    11  
    12  // search exercise the chef api
    13  func Search() {
    14  	// Add nodes
    15  	client := Client(nil)
    16  	addNodes(client)
    17  	// Give the nodes time to end up in all of the data bases.  An immediate search will show no nodes
    18  	time.Sleep(10 * time.Second)
    19  
    20  	// List Indexes
    21  	indexes, err := client.Search.Indexes()
    22  	if err != nil {
    23  		fmt.Fprintln(os.Stderr, "Issue listing indexes ", err)
    24  	}
    25  	fmt.Printf("List indexes %+v EndIndex\n", indexes)
    26  
    27  	// build an invalid seach query
    28  	query, err := client.Search.NewQuery("node", "name")
    29  	if err != nil {
    30  		fmt.Fprintln(os.Stderr, "Issue building invalid query", err)
    31  	}
    32  
    33  	// build a seach query
    34  	query, err = client.Search.NewQuery("node", "name:node*")
    35  	query.Rows = 2
    36  	if err != nil {
    37  		fmt.Fprintln(os.Stderr, "Issue building query ", err)
    38  	}
    39  	fmt.Printf("List new query %+v\n", query)
    40  
    41  	// Run the query
    42  	res, err := query.Do(client)
    43  	if err != nil {
    44  		fmt.Fprintln(os.Stderr, "Issue running query ", err)
    45  	}
    46  	fmt.Printf("List nodes from query %+v\n", res)
    47  
    48  	// Run the query, JSON output
    49  	jres, err := query.DoJSON(client)
    50  	if err != nil {
    51  		fmt.Fprintln(os.Stderr, "Issue running query ", err)
    52  	}
    53  	fmt.Printf("List nodes from query JSON format %+v\n", jres)
    54  
    55  	// Get the next page of results
    56  	fmt.Printf("Query after the call %+v\n", query)
    57  	query.Start = query.Start + query.Rows
    58  	res, err = query.Do(client)
    59  	if err != nil {
    60  		fmt.Fprintln(os.Stderr, "Issue running 2nd query ", err)
    61  	}
    62  	fmt.Printf("List 2nd set of nodes from query %+v\n", res)
    63  
    64  	// Get the next page of results again, in JSON format
    65  	query.Start = query.Start - query.Rows
    66  	jres, err = query.DoJSON(client)
    67  	if err != nil {
    68  		fmt.Fprintln(os.Stderr, "Issue running 2nd query ", err)
    69  	}
    70  	fmt.Printf("List 2nd set of nodes from query JSON format %+v\n", jres)
    71  
    72  	// You can also use the service to run a query
    73  	res, err = client.Search.Exec("node", "name:node1")
    74  	if err != nil {
    75  		fmt.Fprintln(os.Stderr, "Issue running Search.Exec() ", err)
    76  	}
    77  	fmt.Printf("List nodes from Exec query %+v\n", res)
    78  	// dump out results back in json as an example
    79  	fmt.Println("JSON output example")
    80  	jsonData, err := json.MarshalIndent(res, "", "\t")
    81  	os.Stdout.Write(jsonData)
    82  	os.Stdout.WriteString("\n")
    83  
    84  	res, err = client.Search.Exec("node", "name:*")
    85  	if err != nil {
    86  		fmt.Fprintln(os.Stderr, "Issue running Search.Exec() ", err)
    87  	}
    88  	fmt.Printf("List nodes from all nodes Exec query %+v\n", res)
    89  
    90  	// You can also use the service to run a query JSON Format
    91  	jres, err = client.Search.ExecJSON("node", "name:node1")
    92  	if err != nil {
    93  		fmt.Fprintln(os.Stderr, "Issue running Search.Exec() ", err)
    94  	}
    95  	fmt.Printf("List nodes from Exec query JSON format %+v\n", jres)
    96  	// dump out results back in json as an example
    97  	fmt.Println("JSON output example")
    98  	os.Stdout.WriteString("\n")
    99  
   100  	jres, err = client.Search.ExecJSON("node", "name:*")
   101  	if err != nil {
   102  		fmt.Fprintln(os.Stderr, "Issue running Search.Exec() ", err)
   103  	}
   104  	fmt.Printf("List nodes from all nodes Exec query JSON format %+v\n", jres)
   105  
   106  	// Partial search
   107  	part := make(map[string]interface{})
   108  	part["name"] = []string{"name"}
   109  	jpres, err := client.Search.PartialExecJSON("node", "*:*", part)
   110  	if err != nil {
   111  		fmt.Fprintln(os.Stderr, "Issue running Search.PartialExec()", err)
   112  	}
   113  	fmt.Printf("List nodes from partial search %+v\n", jpres)
   114  
   115  	// Partial search JSON format
   116  	part = make(map[string]interface{})
   117  	part["name"] = []string{"name"}
   118  	jpres, err = client.Search.PartialExecJSON("node", "*:*", part)
   119  	if err != nil {
   120  		fmt.Fprintln(os.Stderr, "Issue running Search.PartialExec()", err)
   121  	}
   122  	fmt.Printf("List nodes from partial search JSON format %+v\n", jpres)
   123  	for i, row := range jpres.Rows {
   124  		fmt.Fprintf(os.Stdout, "Partial search JSON format row: %v rawjson: %v\n", i, string(row.Data))
   125  	}
   126  
   127  	// Clean up nodes
   128  	deleteNodes(client)
   129  }
   130  
   131  func addNodes(client *chef.Client) {
   132  	for i := 0; i < 2; i++ {
   133  		node := chef.NewNode("node" + fmt.Sprintf("%d", i))
   134  		_, err := client.Nodes.Post(node)
   135  		if err != nil {
   136  			fmt.Fprintln(os.Stderr, "Issue adding node", node, err)
   137  		}
   138  		bode := chef.NewNode("bode" + fmt.Sprintf("%d", i))
   139  		_, err = client.Nodes.Post(bode)
   140  		if err != nil {
   141  			fmt.Fprintln(os.Stderr, "Issue adding node", node, err)
   142  		}
   143  	}
   144  	return
   145  }
   146  
   147  func deleteNodes(client *chef.Client) {
   148  	for i := 0; i < 2; i++ {
   149  		err := client.Nodes.Delete("node" + fmt.Sprintf("%d", i))
   150  		if err != nil {
   151  			fmt.Fprintln(os.Stderr, "Issue deleting node", err)
   152  		}
   153  		err = client.Nodes.Delete("bode" + fmt.Sprintf("%d", i))
   154  		if err != nil {
   155  			fmt.Fprintln(os.Stderr, "Issue deleting node", err)
   156  		}
   157  	}
   158  	return
   159  }