1package api
2
3import (
4	"net/http"
5	"path/filepath"
6	"time"
7
8	"code.cloudfoundry.org/clock"
9	"code.cloudfoundry.org/lager"
10	"github.com/concourse/concourse/atc"
11	"github.com/concourse/concourse/atc/api/artifactserver"
12	"github.com/concourse/concourse/atc/api/buildserver"
13	"github.com/concourse/concourse/atc/api/ccserver"
14	"github.com/concourse/concourse/atc/api/checkserver"
15	"github.com/concourse/concourse/atc/api/cliserver"
16	"github.com/concourse/concourse/atc/api/configserver"
17	"github.com/concourse/concourse/atc/api/containerserver"
18	"github.com/concourse/concourse/atc/api/infoserver"
19	"github.com/concourse/concourse/atc/api/jobserver"
20	"github.com/concourse/concourse/atc/api/loglevelserver"
21	"github.com/concourse/concourse/atc/api/pipelineserver"
22	"github.com/concourse/concourse/atc/api/resourceserver"
23	"github.com/concourse/concourse/atc/api/resourceserver/versionserver"
24	"github.com/concourse/concourse/atc/api/teamserver"
25	"github.com/concourse/concourse/atc/api/usersserver"
26	"github.com/concourse/concourse/atc/api/volumeserver"
27	"github.com/concourse/concourse/atc/api/wallserver"
28	"github.com/concourse/concourse/atc/api/workerserver"
29	"github.com/concourse/concourse/atc/creds"
30	"github.com/concourse/concourse/atc/db"
31	"github.com/concourse/concourse/atc/gc"
32	"github.com/concourse/concourse/atc/mainredirect"
33	"github.com/concourse/concourse/atc/worker"
34	"github.com/concourse/concourse/atc/wrappa"
35	"github.com/tedsuo/rata"
36)
37
38func NewHandler(
39	logger lager.Logger,
40
41	externalURL string,
42	clusterName string,
43
44	wrapper wrappa.Wrappa,
45
46	dbTeamFactory db.TeamFactory,
47	dbPipelineFactory db.PipelineFactory,
48	dbJobFactory db.JobFactory,
49	dbResourceFactory db.ResourceFactory,
50	dbWorkerFactory db.WorkerFactory,
51	volumeRepository db.VolumeRepository,
52	containerRepository db.ContainerRepository,
53	destroyer gc.Destroyer,
54	dbBuildFactory db.BuildFactory,
55	dbCheckFactory db.CheckFactory,
56	dbResourceConfigFactory db.ResourceConfigFactory,
57	dbUserFactory db.UserFactory,
58
59	eventHandlerFactory buildserver.EventHandlerFactory,
60
61	workerClient worker.Client,
62
63	sink *lager.ReconfigurableSink,
64
65	isTLSEnabled bool,
66
67	cliDownloadsDir string,
68	version string,
69	workerVersion string,
70	secretManager creds.Secrets,
71	varSourcePool creds.VarSourcePool,
72	credsManagers creds.Managers,
73	interceptTimeoutFactory containerserver.InterceptTimeoutFactory,
74	interceptUpdateInterval time.Duration,
75	dbWall db.Wall,
76	clock clock.Clock,
77) (http.Handler, error) {
78
79	absCLIDownloadsDir, err := filepath.Abs(cliDownloadsDir)
80	if err != nil {
81		return nil, err
82	}
83
84	pipelineHandlerFactory := pipelineserver.NewScopedHandlerFactory(dbTeamFactory)
85	buildHandlerFactory := buildserver.NewScopedHandlerFactory(logger)
86	teamHandlerFactory := NewTeamScopedHandlerFactory(logger, dbTeamFactory)
87
88	buildServer := buildserver.NewServer(logger, externalURL, dbTeamFactory, dbBuildFactory, eventHandlerFactory)
89	checkServer := checkserver.NewServer(logger, dbCheckFactory)
90	jobServer := jobserver.NewServer(logger, externalURL, secretManager, dbJobFactory, dbCheckFactory)
91	resourceServer := resourceserver.NewServer(logger, secretManager, varSourcePool, dbCheckFactory, dbResourceFactory, dbResourceConfigFactory)
92
93	versionServer := versionserver.NewServer(logger, externalURL)
94	pipelineServer := pipelineserver.NewServer(logger, dbTeamFactory, dbPipelineFactory, externalURL)
95	configServer := configserver.NewServer(logger, dbTeamFactory, secretManager)
96	ccServer := ccserver.NewServer(logger, dbTeamFactory, externalURL)
97	workerServer := workerserver.NewServer(logger, dbTeamFactory, dbWorkerFactory)
98	logLevelServer := loglevelserver.NewServer(logger, sink)
99	cliServer := cliserver.NewServer(logger, absCLIDownloadsDir)
100	containerServer := containerserver.NewServer(logger, workerClient, secretManager, varSourcePool, interceptTimeoutFactory, interceptUpdateInterval, containerRepository, destroyer, clock)
101	volumesServer := volumeserver.NewServer(logger, volumeRepository, destroyer)
102	teamServer := teamserver.NewServer(logger, dbTeamFactory, externalURL)
103	infoServer := infoserver.NewServer(logger, version, workerVersion, externalURL, clusterName, credsManagers)
104	artifactServer := artifactserver.NewServer(logger, workerClient)
105	usersServer := usersserver.NewServer(logger, dbUserFactory)
106	wallServer := wallserver.NewServer(dbWall, logger)
107
108	handlers := map[string]http.Handler{
109		atc.GetConfig:  http.HandlerFunc(configServer.GetConfig),
110		atc.SaveConfig: http.HandlerFunc(configServer.SaveConfig),
111
112		atc.GetCC: http.HandlerFunc(ccServer.GetCC),
113
114		atc.ListBuilds:          http.HandlerFunc(buildServer.ListBuilds),
115		atc.CreateBuild:         teamHandlerFactory.HandlerFor(buildServer.CreateBuild),
116		atc.GetBuild:            buildHandlerFactory.HandlerFor(buildServer.GetBuild),
117		atc.BuildResources:      buildHandlerFactory.HandlerFor(buildServer.BuildResources),
118		atc.AbortBuild:          buildHandlerFactory.HandlerFor(buildServer.AbortBuild),
119		atc.GetBuildPlan:        buildHandlerFactory.HandlerFor(buildServer.GetBuildPlan),
120		atc.GetBuildPreparation: buildHandlerFactory.HandlerFor(buildServer.GetBuildPreparation),
121		atc.BuildEvents:         buildHandlerFactory.HandlerFor(buildServer.BuildEvents),
122		atc.ListBuildArtifacts:  buildHandlerFactory.HandlerFor(buildServer.GetBuildArtifacts),
123
124		atc.GetCheck: http.HandlerFunc(checkServer.GetCheck),
125
126		atc.ListAllJobs:    http.HandlerFunc(jobServer.ListAllJobs),
127		atc.ListJobs:       pipelineHandlerFactory.HandlerFor(jobServer.ListJobs),
128		atc.GetJob:         pipelineHandlerFactory.HandlerFor(jobServer.GetJob),
129		atc.ListJobBuilds:  pipelineHandlerFactory.HandlerFor(jobServer.ListJobBuilds),
130		atc.ListJobInputs:  pipelineHandlerFactory.HandlerFor(jobServer.ListJobInputs),
131		atc.GetJobBuild:    pipelineHandlerFactory.HandlerFor(jobServer.GetJobBuild),
132		atc.CreateJobBuild: pipelineHandlerFactory.HandlerFor(jobServer.CreateJobBuild),
133		atc.RerunJobBuild:  pipelineHandlerFactory.HandlerFor(jobServer.RerunJobBuild),
134		atc.PauseJob:       pipelineHandlerFactory.HandlerFor(jobServer.PauseJob),
135		atc.UnpauseJob:     pipelineHandlerFactory.HandlerFor(jobServer.UnpauseJob),
136		atc.ScheduleJob:    pipelineHandlerFactory.HandlerFor(jobServer.ScheduleJob),
137		atc.JobBadge:       pipelineHandlerFactory.HandlerFor(jobServer.JobBadge),
138		atc.MainJobBadge: mainredirect.Handler{
139			Routes: atc.Routes,
140			Route:  atc.JobBadge,
141		},
142
143		atc.ClearTaskCache: pipelineHandlerFactory.HandlerFor(jobServer.ClearTaskCache),
144
145		atc.ListAllPipelines:    http.HandlerFunc(pipelineServer.ListAllPipelines),
146		atc.ListPipelines:       http.HandlerFunc(pipelineServer.ListPipelines),
147		atc.GetPipeline:         pipelineHandlerFactory.HandlerFor(pipelineServer.GetPipeline),
148		atc.DeletePipeline:      pipelineHandlerFactory.HandlerFor(pipelineServer.DeletePipeline),
149		atc.OrderPipelines:      http.HandlerFunc(pipelineServer.OrderPipelines),
150		atc.PausePipeline:       pipelineHandlerFactory.HandlerFor(pipelineServer.PausePipeline),
151		atc.ArchivePipeline:     pipelineHandlerFactory.HandlerFor(pipelineServer.ArchivePipeline),
152		atc.UnpausePipeline:     pipelineHandlerFactory.HandlerFor(pipelineServer.UnpausePipeline),
153		atc.ExposePipeline:      pipelineHandlerFactory.HandlerFor(pipelineServer.ExposePipeline),
154		atc.HidePipeline:        pipelineHandlerFactory.HandlerFor(pipelineServer.HidePipeline),
155		atc.GetVersionsDB:       pipelineHandlerFactory.HandlerFor(pipelineServer.GetVersionsDB),
156		atc.RenamePipeline:      pipelineHandlerFactory.HandlerFor(pipelineServer.RenamePipeline),
157		atc.ListPipelineBuilds:  pipelineHandlerFactory.HandlerFor(pipelineServer.ListPipelineBuilds),
158		atc.CreatePipelineBuild: pipelineHandlerFactory.HandlerFor(pipelineServer.CreateBuild),
159		atc.PipelineBadge:       pipelineHandlerFactory.HandlerFor(pipelineServer.PipelineBadge),
160
161		atc.ListAllResources:        http.HandlerFunc(resourceServer.ListAllResources),
162		atc.ListResources:           pipelineHandlerFactory.HandlerFor(resourceServer.ListResources),
163		atc.ListResourceTypes:       pipelineHandlerFactory.HandlerFor(resourceServer.ListVersionedResourceTypes),
164		atc.GetResource:             pipelineHandlerFactory.HandlerFor(resourceServer.GetResource),
165		atc.UnpinResource:           pipelineHandlerFactory.HandlerFor(resourceServer.UnpinResource),
166		atc.SetPinCommentOnResource: pipelineHandlerFactory.HandlerFor(resourceServer.SetPinCommentOnResource),
167		atc.CheckResource:           pipelineHandlerFactory.HandlerFor(resourceServer.CheckResource),
168		atc.CheckResourceWebHook:    pipelineHandlerFactory.HandlerFor(resourceServer.CheckResourceWebHook),
169		atc.CheckResourceType:       pipelineHandlerFactory.HandlerFor(resourceServer.CheckResourceType),
170
171		atc.ListResourceVersions:          pipelineHandlerFactory.HandlerFor(versionServer.ListResourceVersions),
172		atc.GetResourceVersion:            pipelineHandlerFactory.HandlerFor(versionServer.GetResourceVersion),
173		atc.EnableResourceVersion:         pipelineHandlerFactory.HandlerFor(versionServer.EnableResourceVersion),
174		atc.DisableResourceVersion:        pipelineHandlerFactory.HandlerFor(versionServer.DisableResourceVersion),
175		atc.PinResourceVersion:            pipelineHandlerFactory.HandlerFor(versionServer.PinResourceVersion),
176		atc.ListBuildsWithVersionAsInput:  pipelineHandlerFactory.HandlerFor(versionServer.ListBuildsWithVersionAsInput),
177		atc.ListBuildsWithVersionAsOutput: pipelineHandlerFactory.HandlerFor(versionServer.ListBuildsWithVersionAsOutput),
178		atc.GetResourceCausality:          pipelineHandlerFactory.HandlerFor(versionServer.GetCausality),
179
180		atc.ListWorkers:     http.HandlerFunc(workerServer.ListWorkers),
181		atc.RegisterWorker:  http.HandlerFunc(workerServer.RegisterWorker),
182		atc.LandWorker:      http.HandlerFunc(workerServer.LandWorker),
183		atc.RetireWorker:    http.HandlerFunc(workerServer.RetireWorker),
184		atc.PruneWorker:     http.HandlerFunc(workerServer.PruneWorker),
185		atc.HeartbeatWorker: http.HandlerFunc(workerServer.HeartbeatWorker),
186		atc.DeleteWorker:    http.HandlerFunc(workerServer.DeleteWorker),
187
188		atc.SetLogLevel: http.HandlerFunc(logLevelServer.SetMinLevel),
189		atc.GetLogLevel: http.HandlerFunc(logLevelServer.GetMinLevel),
190
191		atc.DownloadCLI:  http.HandlerFunc(cliServer.Download),
192		atc.GetInfo:      http.HandlerFunc(infoServer.Info),
193		atc.GetInfoCreds: http.HandlerFunc(infoServer.Creds),
194
195		atc.GetUser:              http.HandlerFunc(usersServer.GetUser),
196		atc.ListActiveUsersSince: http.HandlerFunc(usersServer.GetUsersSince),
197
198		atc.ListContainers:           teamHandlerFactory.HandlerFor(containerServer.ListContainers),
199		atc.GetContainer:             teamHandlerFactory.HandlerFor(containerServer.GetContainer),
200		atc.HijackContainer:          teamHandlerFactory.HandlerFor(containerServer.HijackContainer),
201		atc.ListDestroyingContainers: http.HandlerFunc(containerServer.ListDestroyingContainers),
202		atc.ReportWorkerContainers:   http.HandlerFunc(containerServer.ReportWorkerContainers),
203
204		atc.ListVolumes:           teamHandlerFactory.HandlerFor(volumesServer.ListVolumes),
205		atc.ListDestroyingVolumes: http.HandlerFunc(volumesServer.ListDestroyingVolumes),
206		atc.ReportWorkerVolumes:   http.HandlerFunc(volumesServer.ReportWorkerVolumes),
207
208		atc.ListTeams:      http.HandlerFunc(teamServer.ListTeams),
209		atc.GetTeam:        http.HandlerFunc(teamServer.GetTeam),
210		atc.SetTeam:        http.HandlerFunc(teamServer.SetTeam),
211		atc.RenameTeam:     http.HandlerFunc(teamServer.RenameTeam),
212		atc.DestroyTeam:    http.HandlerFunc(teamServer.DestroyTeam),
213		atc.ListTeamBuilds: http.HandlerFunc(teamServer.ListTeamBuilds),
214
215		atc.CreateArtifact: teamHandlerFactory.HandlerFor(artifactServer.CreateArtifact),
216		atc.GetArtifact:    teamHandlerFactory.HandlerFor(artifactServer.GetArtifact),
217
218		atc.GetWall:   http.HandlerFunc(wallServer.GetWall),
219		atc.SetWall:   http.HandlerFunc(wallServer.SetWall),
220		atc.ClearWall: http.HandlerFunc(wallServer.ClearWall),
221	}
222
223	return rata.NewRouter(atc.Routes, wrapper.Wrap(handlers))
224}
225