github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/clients/conditions.go (about)

     1  package clients
     2  
     3  import (
     4  	"os"
     5  	"strconv"
     6  	"strings"
     7  	"testing"
     8  )
     9  
    10  // RequiredSystemScope will restrict a test to only be run by system scope.
    11  func RequiredSystemScope(t *testing.T) {
    12  	if os.Getenv("OS_SYSTEM_SCOPE") != "all" {
    13  		t.Skip("must use system scope to run this test")
    14  	}
    15  }
    16  
    17  // RequireManilaReplicas will restrict a test to only be run with enabled
    18  // manila replicas.
    19  func RequireManilaReplicas(t *testing.T) {
    20  	if os.Getenv("OS_MANILA_REPLICAS") != "true" {
    21  		t.Skip("manila replicas must be enabled to run this test")
    22  	}
    23  }
    24  
    25  // RequireAdmin will restrict a test to only be run by admin users.
    26  func RequireAdmin(t *testing.T) {
    27  	if os.Getenv("OS_USERNAME") != "admin" {
    28  		t.Skip("must be admin to run this test")
    29  	}
    30  }
    31  
    32  // RequireNonAdmin will restrict a test to only be run by non-admin users.
    33  func RequireNonAdmin(t *testing.T) {
    34  	if os.Getenv("OS_USERNAME") == "admin" {
    35  		t.Skip("must be a non-admin to run this test")
    36  	}
    37  }
    38  
    39  // RequirePortForwarding will restrict a test to only be run in environments
    40  // that support port forwarding
    41  func RequirePortForwarding(t *testing.T) {
    42  	if os.Getenv("OS_PORTFORWARDING_ENVIRONMENT") == "" {
    43  		t.Skip("this test requires support for port forwarding")
    44  	}
    45  }
    46  
    47  // RequireGuestAgent will restrict a test to only be run in
    48  // environments that support the QEMU guest agent.
    49  func RequireGuestAgent(t *testing.T) {
    50  	if os.Getenv("OS_GUEST_AGENT") == "" {
    51  		t.Skip("this test requires support for qemu guest agent and to set OS_GUEST_AGENT to 1")
    52  	}
    53  }
    54  
    55  // RequireIdentityV2 will restrict a test to only be run in
    56  // environments that support the Identity V2 API.
    57  func RequireIdentityV2(t *testing.T) {
    58  	if os.Getenv("OS_IDENTITY_API_VERSION") != "2.0" {
    59  		t.Skip("this test requires support for the identity v2 API")
    60  	}
    61  }
    62  
    63  // RequireLiveMigration will restrict a test to only be run in
    64  // environments that support live migration.
    65  func RequireLiveMigration(t *testing.T) {
    66  	if os.Getenv("OS_LIVE_MIGRATE") == "" {
    67  		t.Skip("this test requires support for live migration and to set OS_LIVE_MIGRATE to 1")
    68  	}
    69  }
    70  
    71  // RequireLong will ensure long-running tests can run.
    72  func RequireLong(t *testing.T) {
    73  	if testing.Short() {
    74  		t.Skip("skipping test in short mode")
    75  	}
    76  }
    77  
    78  // RequireNovaNetwork will restrict a test to only be run in
    79  // environments that support nova-network.
    80  func RequireNovaNetwork(t *testing.T) {
    81  	if os.Getenv("OS_NOVANET") == "" {
    82  		t.Skip("this test requires nova-network and to set OS_NOVANET to 1")
    83  	}
    84  }
    85  
    86  // RequireIronicHTTPBasic will restric a test to be only run in
    87  // environments that have Ironic using http_basic.
    88  func RequireIronicHTTPBasic(t *testing.T) {
    89  	if os.Getenv("IRONIC_ENDPOINT") == "" || os.Getenv("OS_USERNAME") == "" || os.Getenv("OS_PASSWORD") == "" {
    90  		t.Skip("this test requires Ironic using http_basic, set OS_USERNAME, OS_PASSWORD and IRONIC_ENDPOINT")
    91  	}
    92  }
    93  
    94  func getReleaseFromEnv(t *testing.T) string {
    95  	current := strings.TrimPrefix(os.Getenv("OS_BRANCH"), "stable/")
    96  	if current == "" {
    97  		t.Fatal("this test requires OS_BRANCH to be set but it wasn't")
    98  	}
    99  	return current
   100  }
   101  
   102  // SkipRelease will have the test be skipped on a certain
   103  // release. Releases are named such as 'stable/mitaka', master, etc.
   104  func SkipRelease(t *testing.T, release string) {
   105  	current := getReleaseFromEnv(t)
   106  	if current == release {
   107  		t.Skipf("this is not supported in %s", release)
   108  	}
   109  }
   110  
   111  // SkipReleasesBelow will have the test be skipped on releases below a certain
   112  // one. Releases are named such as 'stable/mitaka', master, etc.
   113  func SkipReleasesBelow(t *testing.T, release string) {
   114  	current := getReleaseFromEnv(t)
   115  
   116  	if IsCurrentBelow(t, release) {
   117  		t.Skipf("this is not supported below %s, testing in %s", release, current)
   118  	}
   119  }
   120  
   121  // SkipReleasesAbove will have the test be skipped on releases above a certain
   122  // one. The test is always skipped on master release. Releases are named such
   123  // as 'stable/mitaka', master, etc.
   124  func SkipReleasesAbove(t *testing.T, release string) {
   125  	current := getReleaseFromEnv(t)
   126  
   127  	if IsCurrentAbove(t, release) {
   128  		t.Skipf("this is not supported above %s, testing in %s", release, current)
   129  	}
   130  }
   131  
   132  func isReleaseNumeral(release string) bool {
   133  	_, err := strconv.Atoi(release[0:1])
   134  	return err == nil
   135  }
   136  
   137  // IsCurrentAbove will return true on releases above a certain
   138  // one. The result is always true on master release. Releases are named such
   139  // as 'stable/mitaka', master, etc.
   140  func IsCurrentAbove(t *testing.T, release string) bool {
   141  	current := getReleaseFromEnv(t)
   142  	release = strings.TrimPrefix(release, "stable/")
   143  
   144  	if release != "master" {
   145  		// Assume master is always too new
   146  		if current == "master" {
   147  			return true
   148  		}
   149  		// Numeral releases are always newer than non-numeral ones
   150  		if isReleaseNumeral(current) && !isReleaseNumeral(release) {
   151  			return true
   152  		}
   153  		if current > release && !(!isReleaseNumeral(current) && isReleaseNumeral(release)) {
   154  			return true
   155  		}
   156  	}
   157  	t.Logf("Target release %s is below the current branch %s", release, current)
   158  	return false
   159  }
   160  
   161  // IsCurrentBelow will return true on releases below a certain
   162  // one. Releases are named such as 'stable/mitaka', master, etc.
   163  func IsCurrentBelow(t *testing.T, release string) bool {
   164  	current := getReleaseFromEnv(t)
   165  	release = strings.TrimPrefix(release, "stable/")
   166  
   167  	if current != "master" {
   168  		// Assume master is always too new
   169  		if release == "master" {
   170  			return true
   171  		}
   172  		// Numeral releases are always newer than non-numeral ones
   173  		if isReleaseNumeral(release) && !isReleaseNumeral(current) {
   174  			return true
   175  		}
   176  		if release > current && !(!isReleaseNumeral(release) && isReleaseNumeral(current)) {
   177  			return true
   178  		}
   179  	}
   180  	t.Logf("Target release %s is above the current branch %s", release, current)
   181  	return false
   182  }