func (gc *Reflector) watchHandler(w watch.Interface) { for { event, ok := <-w.ResultChan() if !ok { glog.Errorf("unexpected watch close") return } if e, a := gc.expectedType, reflect.TypeOf(event.Object); e != a { glog.Errorf("expected type %v, but watch event object had type %v", e, a) continue } jsonBase, err := api.FindJSONBase(event.Object) if err != nil { glog.Errorf("unable to understand watch event %#v", event) continue } switch event.Type { case watch.Added: gc.store.Add(jsonBase.ID(), event.Object) case watch.Modified: gc.store.Update(jsonBase.ID(), event.Object) case watch.Deleted: gc.store.Delete(jsonBase.ID(), event.Object) default: glog.Errorf("unable to understand watch event %#v", event) } } }
func (h *EtcdHelper) bodyAndExtractObj(key string, objPtr interface{}, ignoreNotFound bool) (body string, modifiedIndex uint64, err error) { response, err := h.Client.Get(key, false, false) if err != nil && !IsEtcdNotFound(err) { return "", 0, err } if err != nil || response.Node == nil || len(response.Node.Value) == 0 { if ignoreNotFound { pv := reflect.ValueOf(objPtr) pv.Elem().Set(reflect.Zero(pv.Type().Elem())) return "", 0, nil } else if err != nil { return "", 0, err } return "", 0, fmt.Errorf("key '%v' found no nodes field: %#v", key, response) } body = response.Node.Value err = json.Unmarshal([]byte(body), objPtr) if jsonBase, err := api.FindJSONBase(objPtr); err == nil { jsonBase.ResourceVersion = response.Node.ModifiedIndex // Note that err shadows the err returned below, so we won't // return an error just because we failed to find a JSONBase. // This is intentional. } return body, response.Node.ModifiedIndex, err }
// watchHandler watches w and keeps *resourceVersion up to date. func (gc *Reflector) watchHandler(w watch.Interface, resourceVersion *uint64) { for { event, ok := <-w.ResultChan() if !ok { glog.Errorf("unexpected watch close") return } if e, a := gc.expectedType, reflect.TypeOf(event.Object); e != a { glog.Errorf("expected type %v, but watch event object had type %v", e, a) continue } jsonBase, err := api.FindJSONBase(event.Object) if err != nil { glog.Errorf("unable to understand watch event %#v", event) continue } switch event.Type { case watch.Added: gc.store.Add(jsonBase.ID(), event.Object) case watch.Modified: gc.store.Update(jsonBase.ID(), event.Object) case watch.Deleted: // TODO: Will any consumers need access to the "last known // state", which is passed in event.Object? If so, may need // to change this. gc.store.Delete(jsonBase.ID()) default: glog.Errorf("unable to understand watch event %#v", event) } *resourceVersion = jsonBase.ResourceVersion() + 1 } }
func runTest(t *testing.T, source interface{}) { name := reflect.TypeOf(source).Elem().Name() apiObjectFuzzer.Fuzz(source) j, err := api.FindJSONBase(source) if err != nil { t.Fatalf("Unexpected error %v for %#v", err, source) } j.SetKind("") j.SetAPIVersion("") data, err := api.Encode(source) if err != nil { t.Errorf("%v: %v (%#v)", name, err, source) return } obj2, err := api.Decode(data) if err != nil { t.Errorf("%v: %v", name, err) return } else { if !reflect.DeepEqual(source, obj2) { t.Errorf("1: %v: diff: %v", name, objDiff(source, obj2)) return } } obj3 := reflect.New(reflect.TypeOf(source).Elem()).Interface() err = api.DecodeInto(data, obj3) if err != nil { t.Errorf("2: %v: %v", name, err) return } else { if !reflect.DeepEqual(source, obj3) { t.Errorf("3: %v: diff: %v", name, objDiff(source, obj3)) return } } }
func executeAPIRequest(method string, s *kube_client.Client) bool { storage, path, hasSuffix := storagePathFromArg(flag.Arg(1)) validStorage := checkStorage(storage) verb := "" setBody := false var version uint64 switch method { case "get": verb = "GET" if !validStorage || !hasSuffix { glog.Fatalf("usage: kubecfg [OPTIONS] %s <%s>[/<id>]", method, prettyWireStorage()) } case "list": verb = "GET" if !validStorage || hasSuffix { glog.Fatalf("usage: kubecfg [OPTIONS] %s <%s>", method, prettyWireStorage()) } case "delete": verb = "DELETE" if !validStorage || !hasSuffix { glog.Fatalf("usage: kubecfg [OPTIONS] %s <%s>/<id>", method, prettyWireStorage()) } case "create": verb = "POST" setBody = true if !validStorage || hasSuffix { glog.Fatalf("usage: kubecfg [OPTIONS] %s <%s>", method, prettyWireStorage()) } case "update": obj, err := s.Verb("GET").Path(path).Do().Get() if err != nil { glog.Fatalf("error obtaining resource version for update: %v", err) } jsonBase, err := api.FindJSONBase(obj) if err != nil { glog.Fatalf("error finding json base for update: %v", err) } version = jsonBase.ResourceVersion() verb = "PUT" setBody = true if !validStorage || !hasSuffix { glog.Fatalf("usage: kubecfg [OPTIONS] %s <%s>/<id>", method, prettyWireStorage()) } default: return false } r := s.Verb(verb). Path(path). ParseSelectorParam("labels", *selector) if setBody { if version != 0 { data := readConfig(storage) obj, err := api.Decode(data) if err != nil { glog.Fatalf("error setting resource version: %v", err) } jsonBase, err := api.FindJSONBase(obj) if err != nil { glog.Fatalf("error setting resource version: %v", err) } jsonBase.SetResourceVersion(version) data, err = api.Encode(obj) if err != nil { glog.Fatalf("error setting resource version: %v", err) } r.Body(data) } else { r.Body(readConfig(storage)) } } result := r.Do() obj, err := result.Get() if err != nil { glog.Fatalf("Got request error: %v\n", err) return false } var printer kubecfg.ResourcePrinter switch { case *json: printer = &kubecfg.IdentityPrinter{} case *yaml: printer = &kubecfg.YAMLPrinter{} case len(*templateFile) > 0 || len(*templateStr) > 0: var data []byte if len(*templateFile) > 0 { var err error data, err = ioutil.ReadFile(*templateFile) if err != nil { glog.Fatalf("Error reading template %s, %v\n", *templateFile, err) return false } } else { data = []byte(*templateStr) } tmpl, err := template.New("output").Parse(string(data)) if err != nil { glog.Fatalf("Error parsing template %s, %v\n", string(data), err) return false } printer = &kubecfg.TemplatePrinter{ Template: tmpl, } default: printer = &kubecfg.HumanReadablePrinter{} } if err = printer.PrintObj(obj, os.Stdout); err != nil { body, _ := result.Raw() glog.Fatalf("Failed to print: %v\nRaw received object:\n%#v\n\nBody received: %v", err, obj, string(body)) } fmt.Print("\n") return true }