@@ -184,7 +184,7 @@ effective use of automation. This section introduces an approach to
184184test automation, but we start by talking about the overall testing
185185strategy.
186186
187- The best- practice for testing in the Cloud/DevOps environment is to
187+ The best practice for testing in the Cloud/DevOps environment is to
188188adopt a *Shift Left * strategy, which introduces tests early in the
189189development cycle, that is, on the left side of the pipeline shown in
190190:numref: `Figure %s <fig-pipeline >`. To apply this principle, you first
@@ -311,16 +311,14 @@ switches).
311311
312312 Example Testing Frameworks used in Aether.
313313
314- Some of the frameworks shown in :numref: `Figure %s
315- <fig-tests>` were co-developed with the corresponding software
316- component. This is true of TestVectors and TestON, which put
317- customized workloads on Stratum (SwitchOS) and ONOS (NetworkOS),
318- respectively. Both are open source, and hence available to pursue for
319- insights into the challenges of building a testing framework. In
320- contrast, NG40 is a proprietary framework for emulating 3GPP-compliant
321- cellular network traffic, which due to the complexity and value in
322- demonstrating adherence to the 3GPP standard, is a closed, commercial
323- product.
314+ Some of the frameworks shown in :numref: `Figure %s <fig-tests >` were
315+ co-developed with the corresponding software component. This is true
316+ of TestVectors and TestON, which put customized workloads on Stratum
317+ (SwitchOS) and ONOS (NetworkOS), respectively. Both are open source,
318+ and hence available to be perused for insights into the challenges of
319+ building a testing framework. In contrast, NG40 is a
320+ close source, proprietary framework for emulating 3GPP-compliant
321+ cellular network traffic.
324322
325323Selenium and Robot are the most general of the five examples. Each is an
326324open source project with an active developer community. Selenium is a
@@ -475,7 +473,7 @@ publish a new Docker image, triggered by a change to a ``VERSION``
475473file stored in the code repo. (We'll see why in Section 4.5.)
476474
477475As an illustrative example, the following is from a Groovy script that
478- defines the pipeline for testing the Aether API, which as we'll see in
476+ defines the pipeline for testing the Aether API, which, as we'll see in
479477the next chapter, is auto-generated by the Runtime Control
480478subsystem. We're interested in the general form of the pipeline, so
481479omit most of the details, but it should be clear from the example what
@@ -518,8 +516,8 @@ patch set.
518516
519517 *Aether uses Jenkins as our CI tool, but another popular option is
520518 GitHub Actions. This is a relatively new feature of GitHub (the
521- cloud service, not the software package) that nicely integrates
522- the code repo with a set of workflows that can be exectued every
519+ cloud service, not to be confused with the software tool Git). GitHub Actions augment
520+ the code repo with a set of workflows that can be executed every
523521 time a patch is submitted. In this setting, a workflow is roughly
524522 analogous to a Groovy pipeline. *
525523
@@ -560,7 +558,7 @@ Config Repo, which includes both the set of Terraform Templates that
560558specify the underlying infrastructure (we've been calling this the
561559cloud platform) and the set of Helm Charts that specify the collection
562560of microservices (sometimes called applications) that are to be
563- deployed on that infrastructure. We already know about Terraform from
561+ deployed on that infrastructure. We discussed Terraform in
564562Chapter 3: it's the agent that actually "acts on" the
565563infrastructure-related forms. For its counterpart on the application
566564side Aether uses an open source project called Fleet.
@@ -704,8 +702,8 @@ Our starting point is to adopt the widely-accepted practice of
704702version number *MAJOR.MINOR.PATCH * (e.g., ``3.2.4 ``), where the
705703*MAJOR * version increments whenever you make an incompatible API
706704change, the *MINOR * version increments when you add functionality in a
707- backward compatible way, and the *PATCH * corresponds to a backwards
708- compatible bug fix.
705+ backward- compatible way, and the *PATCH * corresponds to a
706+ backward- compatible bug fix.
709707
710708.. _reading_semver :
711709.. admonition :: Further Reading
@@ -731,7 +729,7 @@ the software lifecycle:
731729
732730* The commit that does correspond to a finalized patch is also tagged
733731 (in the repo) with the corresponding semantic version number. In
734- git , this tag is bound to a hash that unambiguously identifies the
732+ Git , this tag is bound to a hash that unambiguously identifies the
735733 commit, making it the authoritative way of binding a version number
736734 to a particular instance of the source code.
737735
@@ -797,7 +795,7 @@ chapter.
7977954.6 Managing Secrets
798796--------------------
799797
800- The discussion up this point has glossed over one important detail,
798+ The discussion up to this point has glossed over one important detail,
801799which is how secrets are managed. These include, for example, the
802800credentials Terraform needs to access remote services like GCP, as
803801well as the keys used to secure communication among microservices
@@ -852,7 +850,7 @@ Controller to use its sealing key to help them unlock those secrets.
852850
853851While this approach is less general than the first (i.e., it is
854852specific to protecting secrets within a Kubernetes cluster), it has
855- the advantage of taking humans completely out-of- the- loop, with the
853+ the advantage of taking humans completely out of the loop, with the
856854sealing key being programmatically generated at runtime. One
857855complication, however, is that it is generally preferable for that
858856secret to be written to persistent storage, to protect against having
@@ -898,7 +896,7 @@ with a particular set of use cases in mind, but it is later integrated
898896with other software to build entirely new cloud apps that have their
899897own set of abstractions and features, and correspondingly, their own
900898collection of configuration state. This is true for Aether, where the
901- SD-Core subsystem was originally implemented for use in global
899+ SD-Core subsystem, for example, was originally implemented for use in global
902900cellular networks, but is being repurposed to support private 4G/5G in
903901enterprises.
904902
0 commit comments