Load load plugin by config param. This method need be called before domain init to inject global variable info during bootstrap.
(ctx context.Context, cfg Config)
| 137 | // Load load plugin by config param. |
| 138 | // This method need be called before domain init to inject global variable info during bootstrap. |
| 139 | func Load(ctx context.Context, cfg Config) (err error) { |
| 140 | tiPlugins := &plugins{ |
| 141 | plugins: make(map[Kind][]Plugin), |
| 142 | versions: make(map[string]uint16, len(cfg.EnvVersion)), |
| 143 | dyingPlugins: make([]Plugin, 0), |
| 144 | } |
| 145 | |
| 146 | // Setup component version info for plugin running env. |
| 147 | for component, version := range cfg.EnvVersion { |
| 148 | tiPlugins.versions[component] = version |
| 149 | } |
| 150 | |
| 151 | // Load plugin dl & manifest. |
| 152 | for _, pluginID := range cfg.Plugins { |
| 153 | var pName string |
| 154 | pName, _, err = ID(pluginID).Decode() |
| 155 | if err != nil { |
| 156 | err = errors.Trace(err) |
| 157 | return |
| 158 | } |
| 159 | // Check duplicate. |
| 160 | _, dup := tiPlugins.versions[pName] |
| 161 | if dup { |
| 162 | if cfg.SkipWhenFail { |
| 163 | logutil.Logger(ctx).Warn("duplicate load %s and ignored", zap.String("pluginName", pName)) |
| 164 | continue |
| 165 | } |
| 166 | err = errDuplicatePlugin.GenWithStackByArgs(pluginID) |
| 167 | return |
| 168 | } |
| 169 | // Load dl. |
| 170 | var plugin Plugin |
| 171 | plugin, err = loadOne(cfg.PluginDir, ID(pluginID)) |
| 172 | if err != nil { |
| 173 | if cfg.SkipWhenFail { |
| 174 | logutil.Logger(ctx).Warn("load plugin failure and ignored", zap.String("pluginID", pluginID), zap.Error(err)) |
| 175 | continue |
| 176 | } |
| 177 | return |
| 178 | } |
| 179 | tiPlugins.add(&plugin) |
| 180 | } |
| 181 | |
| 182 | // Cross validate & Load plugins. |
| 183 | for kind := range tiPlugins.plugins { |
| 184 | for i := range tiPlugins.plugins[kind] { |
| 185 | if err = tiPlugins.plugins[kind][i].validate(ctx, tiPlugins); err != nil { |
| 186 | if cfg.SkipWhenFail { |
| 187 | logutil.Logger(ctx).Warn("validate plugin fail and disable plugin", |
| 188 | zap.String("plugin", tiPlugins.plugins[kind][i].Name), zap.Error(err)) |
| 189 | tiPlugins.plugins[kind][i].State = Disable |
| 190 | //nolint: ineffassign |
| 191 | err = nil |
| 192 | continue |
| 193 | } |
| 194 | return |
| 195 | } |
| 196 | } |