Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: logdog/common/types/url.go

Issue 2695383002: milo: Enable Swarming LogDog log loading. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The LUCI Authors. All rights reserved.
2 // Use of this source code is governed under the Apache License, Version 2.0
3 // that can be found in the LICENSE file.
4
5 package types
6
7 import (
8 "net/url"
9 "strings"
10
11 "github.com/luci/luci-go/common/errors"
12 "github.com/luci/luci-go/luci_config/common/cfgtypes"
13 )
14
15 const logDogURLScheme = "logdog"
16
17 // Stream is a fully-qualified LogDog stream definition.
18 type Stream struct {
hinoka 2017/02/16 02:08:21 StreamAddr
dnj 2017/02/16 02:20:51 Done.
19 // Host is the LogDog host.
20 Host string
21
22 // Project is the LUCI project name that this log belongs to.
23 Project cfgtypes.ProjectName
24
25 // Path is the LogDog stream path.
26 Path StreamPath
27 }
28
29 // URL returns a LogDog URL that represents this Stream.
30 func (s *Stream) URL() *url.URL {
31 return &url.URL{
32 Scheme: logDogURLScheme,
33 Host: s.Host,
34 Path: strings.Join([]string{"", string(s.Project), string(s.Pa th)}, "/"),
35 }
36 }
37
38 // ParseURL parses a LogDog URL into a Stream. If the URL is malformed, or
39 // if the host, project, or path is invalid, an error will be returned.
40 //
41 // A LogDog URL has the form:
42 // logdog://<host>/<project>/<prefix>/+/<name>
43 func ParseURL(v string) (*Stream, error) {
44 u, err := url.Parse(v)
45 if err != nil {
46 return nil, errors.Annotate(err).Reason("failed to parse URL").E rr()
47 }
48
49 // Validate Scheme.
50 if u.Scheme != logDogURLScheme {
51 return nil, errors.Reason("URL scheme %(scheme)q is not "+logDog URLScheme).
52 D("scheme", u.Scheme).
53 Err()
54 }
55 def := Stream{
56 Host: u.Host,
57 }
58
59 parts := strings.SplitN(u.Path, "/", 3)
60 if len(parts) != 3 || len(parts[0]) != 0 {
61 return nil, errors.Reason("URL path does not include both projec t and path components: %(path)s").
62 D("path", u.Path).
63 Err()
64 }
65
66 def.Project, def.Path = cfgtypes.ProjectName(parts[1]), StreamPath(parts [2])
67 if err := def.Project.Validate(); err != nil {
68 return nil, errors.Annotate(err).Reason("invalid project name: % (project)q").
69 D("project", def.Project).
70 Err()
71 }
72
73 if err := def.Path.Validate(); err != nil {
74 return nil, errors.Annotate(err).Reason("invalid stream path: %( path)q").
75 D("path", def.Path).
76 Err()
77 }
78
79 return &def, nil
80 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698