@@ -24,6 +24,7 @@ import (
2424 "opendeps.org/opendeps/model"
2525 "opendeps.org/opendeps/openapi"
2626 "os"
27+ "strings"
2728)
2829
2930var quitIfDown , stopIfDown , failOptional bool
@@ -42,30 +43,15 @@ marked as required.`,
4243 logrus .Fatal (err )
4344 }
4445
45- logrus .Info ("testing dependencies" )
46- spec := model .Parse (specFile )
47-
48- unavailable := false
49- for _ , dep := range spec .Dependencies {
50- err := testDependency (specFile , dep )
51- if err != nil {
52- if dep .Required || failOptional {
53- logrus .Warnf ("\u274C unavailable: %v: %v" , dep .Summary , err )
54- unavailable = true
55- if stopIfDown {
56- break
57- }
58- } else {
59- logrus .Warnf ("\u26A0 unavailable: %v: %v" , dep .Summary , err )
60- }
61- } else {
62- logrus .Infof ("\u2705 available: %v" , dep .Summary )
63- }
64- }
46+ successful , tested := testDependencies (specFile )
6547
66- // at least one dependency failed
67- if unavailable && quitIfDown {
68- os .Exit (1 )
48+ if successful == tested {
49+ logrus .Infof ("all %d dependencies are available" , tested )
50+ } else {
51+ // at least one dependency failed
52+ if quitIfDown {
53+ os .Exit (1 )
54+ }
6955 }
7056 },
7157}
@@ -78,6 +64,31 @@ func init() {
7864 testCmd .Flags ().BoolVarP (& failOptional , "fail-optional" , "o" , false , "Fail if optional dependencies are down (default false)" )
7965}
8066
67+ func testDependencies (specFile string ) (successful int , tested int ) {
68+ logrus .Debugf ("reading opendeps manifest: %v" , specFile )
69+ spec := model .Parse (specFile )
70+
71+ logrus .Infof ("testing %d dependencies" , len (spec .Dependencies ))
72+ available := 0
73+ for _ , dep := range spec .Dependencies {
74+ err := testDependency (specFile , dep )
75+ if err != nil {
76+ if dep .Required || failOptional {
77+ logrus .Warnf ("\u274C unavailable: %v: %v" , dep .Summary , err )
78+ if stopIfDown {
79+ break
80+ }
81+ } else {
82+ logrus .Warnf ("\u26A0 unavailable: %v: %v" , dep .Summary , err )
83+ }
84+ } else {
85+ logrus .Infof ("\u2705 available: %v" , dep .Summary )
86+ available ++
87+ }
88+ }
89+ return available , len (spec .Dependencies )
90+ }
91+
8192func testDependency (specFile string , dep model.Dependency ) error {
8293 if "" != dep .Availability .Security {
8394 logrus .Warnf ("security configuration for availability endpoints is not supported\n " )
@@ -94,7 +105,9 @@ func testDependency(specFile string, dep model.Dependency) error {
94105 if err != nil {
95106 return err
96107 }
97- url = fmt .Sprintf ("%v/%v" , basePath , dep .Availability .Path )
108+ trimmedBasePath := strings .TrimSuffix (basePath , "/" )
109+ trimmedPath := strings .TrimPrefix (dep .Availability .Path , "/" )
110+ url = fmt .Sprintf ("%v/%v" , trimmedBasePath , trimmedPath )
98111
99112 } else {
100113 panic (fmt .Errorf ("No availability URL or path for %v\n " , dep .Summary ))
@@ -104,7 +117,7 @@ func testDependency(specFile string, dep model.Dependency) error {
104117 if err != nil {
105118 return fmt .Errorf ("failed to reach availability URL [%v]: %v\n " , url , err )
106119 } else {
107- logrus .Debugf ("%v availability: %s\n " , dep .Summary , resp .Status )
120+ logrus .Debugf ("checked availability [%v] : %s\n " , dep .Summary , resp .Status )
108121 if resp .StatusCode < 200 || resp .StatusCode > 299 {
109122 return fmt .Errorf ("failed to reach availability URL [%v]: %s\n " , url , resp .Status )
110123 }
0 commit comments