@@ -17,7 +17,7 @@ import (
17
17
const (
18
18
composerEnvironmentEnvVariablesRegexp = "[a-zA-Z_][a-zA-Z0-9_]*."
19
19
composerEnvironmentReservedAirflowEnvVarRegexp = "AIRFLOW__[A-Z0-9_]+__[A-Z0-9_]+"
20
- composerEnvironmentVersionRegexp = `composer-([0-9]+\.[0-9]+\.[0-9]+(-preview\.[0-9]+)?|latest)-airflow-([0-9]+\.[0-9]+(\.[0-9]+.* )?)`
20
+ composerEnvironmentVersionRegexp = `composer-(( [0-9]+)( \.[0-9]+\.[0-9]+(-preview\.[0-9]+)?)? |latest)-airflow-(( [0-9]+\.[0-9]+) (\.[0-9]+)?)`
21
21
)
22
22
23
23
var composerEnvironmentReservedEnvVar = map [string ]struct {}{
@@ -322,7 +322,7 @@ func resourceComposerEnvironment() *schema.Resource {
322
322
AtLeastOneOf : composerSoftwareConfigKeys ,
323
323
ValidateFunc : validateRegexp (composerEnvironmentVersionRegexp ),
324
324
DiffSuppressFunc : composerImageVersionDiffSuppress ,
325
- Description : `The version of the software running in the environment. This encapsulates both the version of Cloud Composer functionality and the version of Apache Airflow. It must match the regular expression composer-[0-9]+\.[0-9]+( \.[0-9]+)?-airflow-[0-9]+\.[0-9]+(\.[0-9]+.*)? . The Cloud Composer portion of the version is a semantic version. The portion of the image version following 'airflow-' is an official Apache Airflow repository release name . See documentation for allowed release names .` ,
325
+ Description : `The version of the software running in the environment. This encapsulates both the version of Cloud Composer functionality and the version of Apache Airflow. It must match the regular expression composer-( [0-9]+( \.[0-9]+\.[0-9]+(-preview \.[0-9]+)?)?|latest) -airflow-( [0-9]+\.[0-9]+(\.[0-9]+)?) . The Cloud Composer portion of the image version is a full semantic version, or an alias in the form of major version number or 'latest' . The Apache Airflow portion of the image version is a full semantic version that points to one of the supported Apache Airflow versions, or an alias in the form of only major and minor versions specified . See documentation for more details and version list .` ,
326
326
},
327
327
"python_version" : {
328
328
Type : schema .TypeString ,
@@ -1903,48 +1903,75 @@ func composerImageVersionDiffSuppress(_, old, new string, _ *schema.ResourceData
1903
1903
versionRe := regexp .MustCompile (composerEnvironmentVersionRegexp )
1904
1904
oldVersions := versionRe .FindStringSubmatch (old )
1905
1905
newVersions := versionRe .FindStringSubmatch (new )
1906
- if oldVersions == nil || len (oldVersions ) < 4 {
1906
+ if oldVersions == nil || len (oldVersions ) < 8 {
1907
1907
// Somehow one of the versions didn't match the regexp or didn't
1908
1908
// have values in the capturing groups. In that case, fall back to
1909
1909
// an equality check.
1910
1910
if old != "" {
1911
- log .Printf ("[WARN] Composer version didn't match regexp: %s" , old )
1911
+ log .Printf ("[WARN] Image version didn't match regexp: %s" , old )
1912
1912
}
1913
1913
return old == new
1914
1914
}
1915
- if newVersions == nil || len (newVersions ) < 3 {
1915
+ if newVersions == nil || len (newVersions ) < 8 {
1916
1916
// Somehow one of the versions didn't match the regexp or didn't
1917
1917
// have values in the capturing groups. In that case, fall back to
1918
1918
// an equality check.
1919
1919
if new != "" {
1920
- log .Printf ("[WARN] Composer version didn't match regexp: %s" , new )
1920
+ log .Printf ("[WARN] Image version didn't match regexp: %s" , new )
1921
1921
}
1922
1922
return old == new
1923
1923
}
1924
1924
1925
- // Check airflow version using the version package to account for
1926
- // diffs like 1.10 and 1.10.0
1927
- eq , err := versionsEqual (oldVersions [3 ], newVersions [3 ])
1928
- if err != nil {
1929
- log .Printf ("[WARN] Could not parse airflow version, %s" , err )
1930
- }
1931
- if ! eq {
1932
- return false
1925
+ oldAirflow := oldVersions [5 ]
1926
+ oldAirflowMajorMinor := oldVersions [6 ]
1927
+ newAirflow := newVersions [5 ]
1928
+ newAirflowMajorMinor := newVersions [6 ]
1929
+ // Check Airflow versions.
1930
+ if oldAirflow == oldAirflowMajorMinor || newAirflow == newAirflowMajorMinor {
1931
+ // If one of the Airflow versions specifies only major and minor version
1932
+ // (like 1.10), we can only compare major and minor versions.
1933
+ eq , err := versionsEqual (oldAirflowMajorMinor , newAirflowMajorMinor )
1934
+ if err != nil {
1935
+ log .Printf ("[WARN] Could not parse airflow version, %s" , err )
1936
+ }
1937
+ if ! eq {
1938
+ return false
1939
+ }
1940
+ } else {
1941
+ // Otherwise, we compare the full Airflow versions (like 1.10.15).
1942
+ eq , err := versionsEqual (oldAirflow , newAirflow )
1943
+ if err != nil {
1944
+ log .Printf ("[WARN] Could not parse airflow version, %s" , err )
1945
+ }
1946
+ if ! eq {
1947
+ return false
1948
+ }
1933
1949
}
1934
1950
1935
- // Check composer version. Assume that "latest" means we should
1936
- // suppress the diff, because we don't have any other way of
1937
- // knowing what the latest version actually is.
1938
- if oldVersions [1 ] == "latest" || newVersions [1 ] == "latest" {
1951
+ oldComposer := oldVersions [1 ]
1952
+ oldComposerMajor := oldVersions [2 ]
1953
+ newComposer := newVersions [1 ]
1954
+ newComposerMajor := newVersions [2 ]
1955
+ // Check Composer versions.
1956
+ if oldComposer == "latest" || newComposer == "latest" {
1957
+ // We don't know what the latest version is so we suppress the diff.
1939
1958
return true
1959
+ } else if oldComposer == oldComposerMajor || newComposer == newComposerMajor {
1960
+ // If one of the Composer versions specifies only major version
1961
+ // (like 1), we can only compare major versions.
1962
+ eq , err := versionsEqual (oldComposerMajor , newComposerMajor )
1963
+ if err != nil {
1964
+ log .Printf ("[WARN] Could not parse composer version, %s" , err )
1965
+ }
1966
+ return eq
1967
+ } else {
1968
+ // Otherwise, we compare the full Composer versions (like 1.18.1).
1969
+ eq , err := versionsEqual (oldComposer , newComposer )
1970
+ if err != nil {
1971
+ log .Printf ("[WARN] Could not parse composer version, %s" , err )
1972
+ }
1973
+ return eq
1940
1974
}
1941
- // If neither version is "latest", check them using the version
1942
- // package like we did for airflow.
1943
- eq , err = versionsEqual (oldVersions [1 ], newVersions [1 ])
1944
- if err != nil {
1945
- log .Printf ("[WARN] Could not parse composer version, %s" , err )
1946
- }
1947
- return eq
1948
1975
}
1949
1976
1950
1977
func versionsEqual (old , new string ) (bool , error ) {
0 commit comments