Skip to content

Latest commit

 

History

History
94 lines (70 loc) · 2.58 KB

README.md

File metadata and controls

94 lines (70 loc) · 2.58 KB

Functions framework demos

This directory holds the validation demos for the functions-framework.

Current supported list:

Depending on the type of runtime, the demos are divided into Knative and Async, please check them separately:

Plugin mechanism

You can preferably refer to this proposal to learn more about how the function framework works.

Take the functions-framework-go as an example, we provide a default plugin called plugin-example, which is integrated inside the functions-framework-go.

There is also a plugin called plugin-custom which is a user-defined plugin.

When defining FUNC_CONTEXT, the user needs to configure the contents of $.prePlugins and $.postPlugins according to the execution order of the plugins.

In demos, we configure the order of plugins as follows.

  "prePlugins": ["plugin-custom", "plugin-example"],
  "postPlugins": ["plugin-custom", "plugin-example"]

The processing in the plugin is as follows:

plugin-custom

func (p *PluginCustom) ExecPreHook(ctx ofctx.RuntimeContext, plugins map[string]plugin.Plugin) error {
	p.stateC = 3
	p.StateC = 3
	return nil
}

func (p *PluginCustom) ExecPostHook(ctx ofctx.RuntimeContext, plugins map[string]plugin.Plugin) error {
	return nil
}

plugin-example

func (p *PluginExample) ExecPreHook(ctx ofctx.RuntimeContext, plugins map[string]plugin.Plugin) error {
	r := preHookLogic(ctx.Ctx)
	p.stateA = 1
	p.stateB = r
	return nil
}

func (p *PluginExample) ExecPostHook(ctx ofctx.RuntimeContext, plugins map[string]plugin.Plugin) error {
	// Get data from another plugin via Plugin.Get()
	plgName := "plugin-custom"
	keyName := "StateC"
	plg, ok := plugins[plgName]
	if ok && plg != nil {
		v, exist := plg.Get(keyName)
		if exist {
			stateC := v.(int64)
			postHookLogic(p.stateA, stateC)
			return nil
		}
	}
	return fmt.Errorf("failed to get %s from plugin %s", keyName, plgName)
}

func preHookLogic(ctx context.Context) context.Context {
	if ctx != nil {
		return ctx
	} else {
		return context.Background()
	}
}

func postHookLogic(numA int64, numB int64) int64 {
	sum := numA + numB
	klog.Infof("the sum is: %d", sum)
	return sum
}

As you can see, the two plugins, when combined, will print the following message:

the sum is: 4