Skip to content

Commit aec431d

Browse files
author
Antonio Salinas
authored
feat: Source Retrieval refactor and Source Manager Implementation (#357)
* Refactor of prepare sources and implementation of source manager. * Source manager tests * Fixed failing source manager test * Updated scenario test and local contents provider
1 parent dcf188b commit aec431d

20 files changed

Lines changed: 1360 additions & 630 deletions

internal/app/azldev/cmds/component/build.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
"github.com/microsoft/azldev/internal/buildenv"
1717
"github.com/microsoft/azldev/internal/orchestration/artifacts"
1818
"github.com/microsoft/azldev/internal/orchestration/orchestrator"
19-
"github.com/microsoft/azldev/internal/projectconfig"
2019
"github.com/microsoft/azldev/internal/providers/sourceproviders"
2120
"github.com/microsoft/azldev/internal/utils/defers"
2221
"github.com/samber/lo"
@@ -149,15 +148,10 @@ func BuildComponent(
149148
workDirFactory *workdir.Factory,
150149
options *ComponentBuildOptions,
151150
) (results ComponentBuildResults, err error) {
152-
var rpmContentsProvider sourceproviders.RPMContentsProvider
153-
154-
// If the component has external sources, then we build an RPM contents provider;
155-
// otherwise, we pass nil to the preparer.
156-
if component.GetConfig().Spec.SourceType == projectconfig.SpecSourceTypeUpstream {
157-
rpmContentsProvider, err = buildRPMContentsProvider(env, component)
158-
if err != nil {
159-
return ComponentBuildResults{}, fmt.Errorf("failed to create RPM contents provider:\n%w", err)
160-
}
151+
sourceManager, err := sourceproviders.NewSourceManager(env)
152+
if err != nil {
153+
return ComponentBuildResults{},
154+
fmt.Errorf("failed to setup source retrieval manager for component %q:\n%w", component.GetName(), err)
161155
}
162156

163157
var buildEnv buildenv.RPMAwareBuildEnv
@@ -177,7 +171,12 @@ func BuildComponent(
177171
return nil
178172
}, &err)
179173

180-
sourcePreparer := sources.NewPreparer(env, env, env.FS(), rpmContentsProvider)
174+
sourcePreparer, err := sources.NewPreparer(env, sourceManager)
175+
if err != nil {
176+
return ComponentBuildResults{},
177+
fmt.Errorf("failed to create source preparer for component %q:\n%w", component.GetName(), err)
178+
}
179+
181180
builder := componentbuilder.New(env, env.FS(), env, sourcePreparer, buildEnv, workDirFactory)
182181

183182
return buildComponentUsingBuilder(env, orchestrator, component, builder,

internal/app/azldev/cmds/component/preparesources.go

Lines changed: 9 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ import (
1010
"github.com/microsoft/azldev/internal/app/azldev"
1111
"github.com/microsoft/azldev/internal/app/azldev/core/components"
1212
"github.com/microsoft/azldev/internal/app/azldev/core/sources"
13-
"github.com/microsoft/azldev/internal/projectconfig"
14-
"github.com/microsoft/azldev/internal/providers/rpmprovider"
1513
"github.com/microsoft/azldev/internal/providers/sourceproviders"
16-
"github.com/microsoft/azldev/internal/rpm"
17-
"github.com/microsoft/azldev/internal/utils/downloader"
18-
"github.com/samber/lo"
1914
"github.com/spf13/cobra"
2015
)
2116

@@ -78,93 +73,23 @@ func PrepareComponentSources(env *azldev.Env, options *PrepareSourcesOptions) er
7873
event := env.StartEvent("Preparing sources", "component", component.GetName())
7974
defer event.End()
8075

81-
var rpmContentsProvider sourceproviders.RPMContentsProvider
76+
var sourceManager sourceproviders.SourceManager
8277

83-
// If the component has external sources, then we build an RPM contents provider;
84-
// otherwise, we pass nil to the preparer.
85-
if component.GetConfig().Spec.SourceType == projectconfig.SpecSourceTypeUpstream {
86-
rpmContentsProvider, err = buildRPMContentsProvider(env, component)
87-
if err != nil {
88-
return fmt.Errorf("failed to create RPM contents provider:\n%w", err)
89-
}
90-
}
91-
92-
preparer := sources.NewPreparer(env, env, env.FS(), rpmContentsProvider)
93-
94-
err = preparer.PrepareSources(env, component, options.OutputDir)
95-
if err != nil {
96-
return fmt.Errorf("failed to prepare sources for component %q:\n%w", component.GetName(), err)
97-
}
98-
99-
return nil
100-
}
101-
102-
func buildRPMContentsProvider(
103-
env *azldev.Env, component components.Component,
104-
) (*sourceproviders.RPMContentsProviderImpl, error) {
105-
repoQuerierOptions, err := composeRepoQuerierOptionsForComponent(env, component)
106-
if err != nil {
107-
return nil, fmt.Errorf("failed to compose repo querying options:\n%w", err)
108-
}
109-
110-
rpmExtractor, err := rpm.NewRPMExtractorImpl(env.FS())
78+
// Create source manager to handle all source fetching, both local and upstream.
79+
sourceManager, err = sourceproviders.NewSourceManager(env)
11180
if err != nil {
112-
return nil, fmt.Errorf("failed to create RPM extractor:\n%w", err)
81+
return fmt.Errorf("failed to create source manager:\n%w", err)
11382
}
11483

115-
httpDownloader, err := downloader.NewHTTPDownloader(env, env, env.FS())
84+
preparer, err := sources.NewPreparer(env, sourceManager)
11685
if err != nil {
117-
return nil, fmt.Errorf("failed to create HTTP downloader:\n%w", err)
86+
return fmt.Errorf("failed to create source preparer:\n%w", err)
11887
}
11988

120-
repoQuerier, err := rpm.NewRQRepoQuerier(env, repoQuerierOptions...)
121-
if err != nil {
122-
return nil, fmt.Errorf("failed to create RPM repo querier:\n%w", err)
123-
}
124-
125-
rpmProvider, err := rpmprovider.NewRPMProviderImpl(env, httpDownloader, repoQuerier)
126-
if err != nil {
127-
return nil, fmt.Errorf("failed to create RPM provider:\n%w", err)
128-
}
129-
130-
rpmContentsProvider, err := sourceproviders.NewRPMContentsProviderImpl(rpmExtractor, rpmProvider)
89+
err = preparer.PrepareSources(env, component, options.OutputDir)
13190
if err != nil {
132-
return nil, fmt.Errorf("failed to create RPM contents provider:\n%w", err)
133-
}
134-
135-
return rpmContentsProvider, nil
136-
}
137-
138-
func composeRepoQuerierOptionsForComponent(
139-
env *azldev.Env, component components.Component,
140-
) ([]rpm.RepoQuerierOption, error) {
141-
specSource := component.GetConfig().Spec
142-
143-
options := []rpm.RepoQuerierOption{}
144-
145-
switch specSource.SourceType {
146-
case projectconfig.SpecSourceTypeUnspecified:
147-
break
148-
case projectconfig.SpecSourceTypeLocal:
149-
break
150-
case projectconfig.SpecSourceTypeUpstream:
151-
distro, distroVer, err := env.ResolveDistroRef(specSource.UpstreamDistro)
152-
if err != nil {
153-
return nil, fmt.Errorf("failed to resolve upstream distro for component %q:\n%w", component.GetName(), err)
154-
}
155-
156-
repoURLs := lo.Map(distro.PackageRepositories, func(repo projectconfig.PackageRepository, _ int) string {
157-
return repo.BaseURI
158-
})
159-
160-
options = append(options, rpm.WithBaseURLs(repoURLs...))
161-
162-
if distroVer.ReleaseVer != "" {
163-
options = append(options, rpm.WithReleaseVer(distroVer.ReleaseVer))
164-
}
165-
default:
166-
break
91+
return fmt.Errorf("failed to prepare sources for component %q:\n%w", component.GetName(), err)
16792
}
16893

169-
return options, nil
94+
return nil
17095
}

internal/app/azldev/core/componentbuilder/componentbuilder_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,16 @@ func setupBuilder(t *testing.T) *componentBuilderTestParams {
4747
workDirFactory, err := workdir.NewFactory(testEnv.Env.FS(), testEnv.Env.WorkDir(), testEnv.Env.ConstructionTime())
4848
require.NoError(t, err)
4949

50-
rpmContentsProvider := sourceproviders_test.NewNoOpMockRPMContentsProvider(ctrl)
50+
sourceManager := sourceproviders_test.NewNoOpMockSourceManager(ctrl)
51+
52+
preparer, err := sources.NewPreparer(testEnv.Env, sourceManager)
53+
54+
require.NoError(t, err)
5155

5256
params := &componentBuilderTestParams{
53-
ctrl: ctrl,
54-
testEnv: testEnv,
55-
sourcePreparer: sources.NewPreparer(
56-
testEnv.DryRunnable, testEnv.Env, testEnv.Env.FS(), rpmContentsProvider,
57-
),
57+
ctrl: ctrl,
58+
testEnv: testEnv,
59+
sourcePreparer: preparer,
5860
workDirFactory: workDirFactory,
5961
}
6062

0 commit comments

Comments
 (0)