// inseryKiteQuery inserts the given kite, url and key to the kite.kite table func insertKiteQuery(kiteProt *protocol.Kite, url, keyId string) (string, []interface{}, error) { psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) kiteValues := kiteProt.Values() values := make([]interface{}, len(kiteValues)) for i, kiteVal := range kiteValues { values[i] = kiteVal } values = append(values, url) values = append(values, keyId) return psql.Insert("kite.kite").Columns( "username", "environment", "kitename", "version", "region", "hostname", "id", "url", "key_id", ).Values(values...).ToSql() }
func (e *Etcd) Update(k *protocol.Kite, value *kontrolprotocol.RegisterValue) error { etcdKey := KitesPrefix + k.String() etcdIDKey := KitesPrefix + "/" + k.ID valueBytes, err := json.Marshal(value) if err != nil { return err } valueString := string(valueBytes) // update the kite key. // Example "/koding/production/os/0.0.1/sj/kontainer1.sj.koding.com/1234asdf..." _, err = e.client.Update(etcdKey, valueString, uint64(KeyTTL/time.Second)) if err != nil { return err } // Also update the the kite.Key Id for easy lookup _, err = e.client.Update(etcdIDKey, valueString, uint64(KeyTTL/time.Second)) if err != nil { return err } // Set the TTL for the username. Otherwise, empty dirs remain in etcd. _, err = e.client.Update(KitesPrefix+"/"+k.Username, "", uint64(KeyTTL/time.Second)) if err != nil { return err } return nil }
func (e *Etcd) Add(k *protocol.Kite, value *kontrolprotocol.RegisterValue) error { etcdKey := KitesPrefix + k.String() etcdIDKey := KitesPrefix + "/" + k.ID valueBytes, err := json.Marshal(value) if err != nil { return err } valueString := string(valueBytes) // Set the kite key. // Example "/koding/production/os/0.0.1/sj/kontainer1.sj.koding.com/1234asdf..." _, err = e.client.Set(etcdKey, valueString, uint64(KeyTTL/time.Second)) if err != nil { return err } // Also store the the kite.Key Id for easy lookup _, err = e.client.Set(etcdIDKey, valueString, uint64(KeyTTL/time.Second)) if err != nil { return err } return nil }
func (e *Etcd) Delete(k *protocol.Kite) error { etcdKey := KitesPrefix + k.String() etcdIDKey := KitesPrefix + "/" + k.ID _, err := e.client.Delete(etcdKey, true) _, err = e.client.Delete(etcdIDKey, true) return err }
// validateKiteKey returns a string representing the kite uniquely // that is suitable to use as a key for etcd. func validateKiteKey(k *protocol.Kite) error { fields := k.Query().Fields() // Validate fields. for k, v := range fields { if v == "" { return fmt.Errorf("Empty Kite field: %s", k) } if strings.ContainsRune(v, '/') { return fmt.Errorf("Field \"%s\" must not contain '/'", k) } } return nil }