Beispiel #1
0
func (m *mockSessionStatePluginProxy) GetConfigPolicy(args []byte, reply *[]byte) error {
	cp := cpolicy.New()
	n1 := cpolicy.NewPolicyNode()
	if m.c {
		r1, _ := cpolicy.NewStringRule("name", false, "bob")
		n1.Add(r1)
		r2, _ := cpolicy.NewIntegerRule("someInt", true, 100)
		n1.Add(r2)
		r3, _ := cpolicy.NewStringRule("password", true)
		n1.Add(r3)
		r4, _ := cpolicy.NewFloatRule("somefloat", false, 3.14)
		n1.Add(r4)
		cp.Add([]string{"foo", "bar"}, n1)
	} else {
		r1, _ := cpolicy.NewIntegerRule("SomeRequiredInt", true, 1)
		r2, _ := cpolicy.NewStringRule("password", true)
		r3, _ := cpolicy.NewFloatRule("somefloat", false, 3.14)
		n1.Add(r1, r2, r3)
		cp.Add([]string{""}, n1)
	}
	cpr := plugin.GetConfigPolicyReply{Policy: cp}
	var err error
	*reply, err = m.e.Encode(cpr)
	return err
}
func (p *mockPlugin) GetConfigPolicy() (*cpolicy.ConfigPolicy, error) {
	cp := cpolicy.New()
	cpn := cpolicy.NewPolicyNode()
	r1, _ := cpolicy.NewStringRule("username", false, "root")
	r2, _ := cpolicy.NewStringRule("password", true)
	r3, _ := cpolicy.NewBoolRule("bool_rule_default_true", false, true)
	r4, _ := cpolicy.NewBoolRule("bool_rule_default_false", false, false)
	r5, _ := cpolicy.NewIntegerRule("integer_rule", true, 1234)
	r5.SetMaximum(9999)
	r5.SetMinimum(1000)
	r6, _ := cpolicy.NewFloatRule("float_rule", true, 0.1234)
	r6.SetMaximum(.9999)
	r6.SetMinimum(.001)
	cpn.Add(r1, r2, r3, r4, r5, r6)
	ns := []string{"one", "two", "potato"}
	cp.Add(ns, cpn)

	return cp, nil
}
Beispiel #3
0
func TestHTTPJSONRPC(t *testing.T) {
	log.SetLevel(log.DebugLevel)
	addr, session := startHTTPJSONRPC()
	time.Sleep(time.Millisecond * 100)

	Convey("Collector Client", t, func() {
		session.c = true
		c, err := NewCollectorHttpJSONRPCClient(fmt.Sprintf("http://%v", addr), 1*time.Second, &key.PublicKey, true)
		So(err, ShouldBeNil)
		So(c, ShouldNotBeNil)
		cl := c.(*httpJSONRPCClient)
		cl.encrypter.Key = symkey

		Convey("Ping", func() {
			err := c.Ping()
			So(err, ShouldBeNil)
		})

		Convey("Kill", func() {
			err := c.Kill("somereason")
			So(err, ShouldBeNil)
		})

		Convey("GetMetricTypes", func() {
			cfg := plugin.NewPluginConfigType()
			cfg.AddItem("test", ctypes.ConfigValueBool{Value: true})
			mts, err := c.GetMetricTypes(cfg)
			So(err, ShouldBeNil)
			So(mts, ShouldNotBeNil)
			So(mts, ShouldHaveSameTypeAs, []core.Metric{})
			So(len(mts), ShouldBeGreaterThan, 0)
			So(len(mts[0].Config().Table()), ShouldBeGreaterThan, 0)
		})

		Convey("CollectMetrics provided a valid config", func() {
			cdn := cdata.NewNode()
			cdn.AddItem("someInt", ctypes.ConfigValueInt{Value: 1})
			cdn.AddItem("password", ctypes.ConfigValueStr{Value: "secure"})

			time.Sleep(500 * time.Millisecond)
			mts, err := c.CollectMetrics([]core.Metric{
				&plugin.PluginMetricType{
					Namespace_: []string{"foo", "bar"},
					Config_:    cdn,
				},
			})
			So(err, ShouldBeNil)
			So(mts, ShouldNotBeNil)
			So(mts, ShouldHaveSameTypeAs, []core.Metric{})
			So(len(mts), ShouldBeGreaterThan, 0)
			So(mts[0].Config().Table(), ShouldNotBeEmpty)
			So(mts[0].Config().Table()["someInt"].Type(), ShouldResemble, "integer")

			Convey("Get and process the ConfigPolicy", func() {
				cp, err := c.GetConfigPolicy()
				So(err, ShouldBeNil)
				So(cp, ShouldNotBeNil)
				So(cp.Get([]string{"foo", "bar"}), ShouldNotBeNil)
				node := cp.Get([]string{"foo", "bar"})
				So(node, ShouldNotBeNil)
				cpn, cserrs := node.Process(mts[0].Config().Table())
				So(cpn, ShouldNotBeNil)
				So((*cpn)["somefloat"].Type(), ShouldResemble, "float")
				So((*cpn)["somefloat"].(*ctypes.ConfigValueFloat).Value, ShouldResemble, 3.14)
				So(cserrs.Errors(), ShouldBeEmpty)
			})
		})

		Convey("CollectMetrics provided an invalid config", func() {
			cdn := cdata.NewNode()
			cdn.AddItem("someInt", ctypes.ConfigValueInt{Value: 1})

			time.Sleep(500 * time.Millisecond)
			mts, err := c.CollectMetrics([]core.Metric{
				&plugin.PluginMetricType{
					Namespace_: []string{"foo", "bar"},
					Config_:    cdn,
				},
			})
			So(err, ShouldBeNil)
			So(mts, ShouldNotBeNil)
			So(mts, ShouldHaveSameTypeAs, []core.Metric{})
			So(len(mts), ShouldBeGreaterThan, 0)
			So(mts[0].Config().Table(), ShouldNotBeEmpty)
			So(mts[0].Config().Table()["someInt"].Type(), ShouldResemble, "integer")

			Convey("Get and process the ConfigPolicy", func() {
				cp, err := c.GetConfigPolicy()
				So(err, ShouldBeNil)
				So(cp, ShouldNotBeNil)
				node := cp.Get([]string{"foo", "bar"})
				So(node, ShouldNotBeNil)
				So(err, ShouldBeNil)
				_, cserrs := node.Process(mts[0].Config().Table())
				//So(cpn, ShouldBeNil)
				So(cserrs.Errors(), ShouldNotBeEmpty)
				So(len(cserrs.Errors()), ShouldEqual, 1)
				So(cserrs.Errors()[0].Error(), ShouldContainSubstring, "password")
			})
		})
	})

	Convey("Processor Client", t, func() {
		session.c = false
		p, _ := NewProcessorHttpJSONRPCClient(fmt.Sprintf("http://%v", addr), 1*time.Second, &key.PublicKey, true)
		cl := p.(*httpJSONRPCClient)
		cl.encrypter.Key = symkey
		So(p, ShouldNotBeNil)

		Convey("GetConfigPolicy", func() {
			cp, err := p.GetConfigPolicy()
			So(err, ShouldBeNil)
			So(cp, ShouldNotBeNil)
			cp_ := cpolicy.New()
			cpn_ := cpolicy.NewPolicyNode()
			r1, err := cpolicy.NewIntegerRule("SomeRequiredInt", true, 1)
			r2, _ := cpolicy.NewStringRule("password", true)
			r3, _ := cpolicy.NewFloatRule("somefloat", false, 3.14)
			So(err, ShouldBeNil)
			cpn_.Add(r1, r2, r3)
			cp_.Add([]string{""}, cpn_)
			cpjson, _ := cp.MarshalJSON()
			cp_json, _ := cp_.MarshalJSON()
			So(string(cpjson), ShouldResemble, string(cp_json))
		})

		Convey("Process metrics", func() {
			pmt := plugin.NewPluginMetricType([]string{"foo", "bar"}, time.Now(), "", nil, nil, 1)
			b, _ := json.Marshal([]plugin.PluginMetricType{*pmt})
			contentType, content, err := p.Process(plugin.SnapJSONContentType, b, nil)
			So(contentType, ShouldResemble, plugin.SnapJSONContentType)
			So(content, ShouldNotBeNil)
			So(err, ShouldEqual, nil)
			var pmts []plugin.PluginMetricType
			err = json.Unmarshal(content, &pmts)
			So(err, ShouldBeNil)
			So(len(pmts), ShouldEqual, 1)
			So(pmts[0].Data(), ShouldEqual, 1)
			So(pmts[0].Namespace(), ShouldResemble, []string{"foo", "bar"})
		})
	})

	Convey("Publisher Client", t, func() {
		session.c = false
		p, _ := NewPublisherHttpJSONRPCClient(fmt.Sprintf("http://%v", addr), 1*time.Second, &key.PublicKey, true)
		cl := p.(*httpJSONRPCClient)
		cl.encrypter.Key = symkey
		So(p, ShouldNotBeNil)

		Convey("GetConfigPolicy", func() {
			cp, err := p.GetConfigPolicy()
			So(err, ShouldBeNil)
			So(cp, ShouldNotBeNil)
			cp_ := cpolicy.New()
			cpn_ := cpolicy.NewPolicyNode()
			r1, err := cpolicy.NewIntegerRule("SomeRequiredInt", true, 1)
			r2, _ := cpolicy.NewStringRule("password", true)
			r3, _ := cpolicy.NewFloatRule("somefloat", false, 3.14)
			So(err, ShouldBeNil)
			cpn_.Add(r1, r2, r3)
			cp_.Add([]string{""}, cpn_)
			cpjson, _ := cp.MarshalJSON()
			cp_json, _ := cp_.MarshalJSON()
			So(string(cpjson), ShouldResemble, string(cp_json))
		})

		Convey("Publish metrics", func() {
			pmt := plugin.NewPluginMetricType([]string{"foo", "bar"}, time.Now(), "", nil, nil, 1)
			b, _ := json.Marshal([]plugin.PluginMetricType{*pmt})
			err := p.Publish(plugin.SnapJSONContentType, b, nil)
			So(err, ShouldBeNil)
		})

	})
}
Beispiel #4
0
func ToConfigPolicy(reply *GetConfigPolicyReply) *cpolicy.ConfigPolicy {
	result := cpolicy.New()
	nodes := make(map[string]*cpolicy.ConfigPolicyNode)
	for k, v := range reply.BoolPolicy {
		if _, ok := nodes[k]; !ok {
			nodes[k] = cpolicy.NewPolicyNode()
		}
		for key, val := range v.Rules {
			var br *cpolicy.BoolRule
			var err error
			if val.HasDefault {
				br, err = cpolicy.NewBoolRule(key, val.Required, val.Default)
			} else {
				br, err = cpolicy.NewBoolRule(key, val.Required)
			}
			if err != nil {
				rpcLogger.Warn("Empty key found with value %v", val)
				continue
			}
			nodes[k].Add(br)
		}
	}

	for k, v := range reply.StringPolicy {
		if _, ok := nodes[k]; !ok {
			nodes[k] = cpolicy.NewPolicyNode()
		}
		for key, val := range v.Rules {
			var sr *cpolicy.StringRule
			var err error
			if val.HasDefault {
				sr, err = cpolicy.NewStringRule(key, val.Required, val.Default)
			} else {
				sr, err = cpolicy.NewStringRule(key, val.Required)
			}
			if err != nil {
				rpcLogger.Warn("Empty key found with value %v", val)
				continue
			}

			nodes[k].Add(sr)
		}
	}

	for k, v := range reply.IntegerPolicy {
		if _, ok := nodes[k]; !ok {
			nodes[k] = cpolicy.NewPolicyNode()
		}
		for key, val := range v.Rules {
			var ir *cpolicy.IntRule
			var err error
			if val.HasDefault {
				ir, err = cpolicy.NewIntegerRule(key, val.Required, int(val.Default))
			} else {
				ir, err = cpolicy.NewIntegerRule(key, val.Required)
			}
			if err != nil {
				rpcLogger.Warn("Empty key found with value %v", val)
				continue
			}
			if val.HasMin {
				ir.SetMinimum(int(val.Minimum))
			}
			if val.HasMax {
				ir.SetMaximum(int(val.Maximum))
			}

			nodes[k].Add(ir)
		}
	}

	for k, v := range reply.FloatPolicy {
		if _, ok := nodes[k]; !ok {
			nodes[k] = cpolicy.NewPolicyNode()
		}
		for key, val := range v.Rules {
			var fr *cpolicy.FloatRule
			var err error
			if val.HasDefault {
				fr, err = cpolicy.NewFloatRule(key, val.Required)
			} else {

				fr, err = cpolicy.NewFloatRule(key, val.Required)
			}
			if err != nil {
				rpcLogger.Warn("Empty key found with value %v", val)
				continue
			}

			if val.HasMin {
				fr.SetMinimum(val.Minimum)
			}
			if val.HasMax {
				fr.SetMaximum(val.Maximum)
			}

			nodes[k].Add(fr)
		}
	}

	for key, node := range nodes {
		keys := strings.Split(key, ".")
		result.Add(keys, node)
	}

	return result
}
Beispiel #5
0
func ToConfigPolicy(reply *GetConfigPolicyReply) *cpolicy.ConfigPolicy {
	result := cpolicy.New()
	nodes := make(map[string]*cpolicy.ConfigPolicyNode)
	for k, v := range reply.BoolPolicy {
		if _, ok := nodes[k]; !ok {
			nodes[k] = cpolicy.NewPolicyNode()
		}
		for key, val := range v.Rules {
			br, err := cpolicy.NewBoolRule(key, val.Required, val.Default)
			if err != nil {
				// The only error that can be thrown is empty key error, ignore something with empty key
				continue
			}
			nodes[k].Add(br)
		}
	}

	for k, v := range reply.StringPolicy {
		if _, ok := nodes[k]; !ok {
			nodes[k] = cpolicy.NewPolicyNode()
		}
		for key, val := range v.Rules {
			sr, err := cpolicy.NewStringRule(key, val.Required, val.Default)
			if err != nil {
				continue
			}

			nodes[k].Add(sr)
		}
	}

	for k, v := range reply.IntegerPolicy {
		if _, ok := nodes[k]; !ok {
			nodes[k] = cpolicy.NewPolicyNode()
		}
		for key, val := range v.Rules {
			sr, err := cpolicy.NewIntegerRule(key, val.Required, int(val.Default))
			if err != nil {
				continue
			}

			nodes[k].Add(sr)
		}
	}

	for k, v := range reply.FloatPolicy {
		if _, ok := nodes[k]; !ok {
			nodes[k] = cpolicy.NewPolicyNode()
		}
		for key, val := range v.Rules {
			sr, err := cpolicy.NewFloatRule(key, val.Required, val.Default)
			if err != nil {
				continue
			}

			nodes[k].Add(sr)
		}
	}

	for key, node := range nodes {
		keys := strings.Split(key, ".")
		result.Add(keys, node)
	}

	return result
}