runFilterPlugin(...) *fwk.Status { ... status := pl.Filter(ctx, state, pod, nodeInfo) // Filter処理の呼び出し ... } func (service *Service) convert(ctx context.Context, job conversionJob) error { ... ̲, err = documentConverter.Convert(ctx, source, lepath.Join( lepath.Dir(source), "derived"), converter.Options{...}) // Convert処理の呼び出し ... FilterPlugin Interfaceの定義 DocumentConverter Interfaceの定義 type FilterPlugin interface { ... type DocumentConverter interface { ... // Filterの共通規則 Filter(ctx context.Context, state CycleState, pod *v1.Pod, nodeInfo NodeInfo) *Status // Convertの共通規則 Convert(ctx context.Context, source, outputDir string, options Options) (Result, error) Filter処理の実装 Convert処理の実装 NodeName Plugin PdfConverter func (pl *NodeName) Filter(ctx context.Context, ̲ fwk.CycleState, pod *v1.Pod, nodeInfo fwk.NodeInfo) *fwk.Status { // NodeNameを満たすNodeを選択する処理 } func (documentConverter pdfConverter) Convert(ctx context.Context, source, outputDir string, options Options) (Result, error) { // PDF形式のファイルを変換する処理 } NodeUnschedulable Plugin DocumentConverter func (pl *NodeUnschedulable) Filter(ctx context.Context, ̲ fwk.CycleState, pod *v1.Pod, nodeInfo fwk.NodeInfo) *fwk.Status { // スケジュール不可(e.g. cordon)なNodeを除外する処理 } func (documentConverter docxConverter) Convert(ctx context.Context, source, outputDir string, options Options) (Result, error) { // DOCX形式のファイルを変換する処理 } fi } fi }