Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.
Requires a signed-in GitHub account. This works well for small changes.
If you'd like to make larger changes you may want to consider using
a local clone.
Change Log: 2.098.1
Download D 2.098.1
released Dec 19, 2021
2.098.1 comes with 106 fixed Bugzilla issues.
A huge thanks goes to the
18 contributors
who made 2.098.1 possible.
List of all bug fixes and enhancements in D 2.098.1.
List of all bug fixes and enhancements in D 2.098.1:
DMD Compiler regression fixes
- Bugzilla 20133: [REG2.084.0] Bogus slice assignment in recursive CTFE call
- Bugzilla 20236: spurious deprecation warnings on function calls within with(X) blocks while X has a deprecated alias this target
- Bugzilla 20860: OpDispatch does not work for structs with constructor and destructor
- Bugzilla 20998: error in static struct initialization causes wrong position for subsequent members, producing extra errors
- Bugzilla 21039: alias this returns 'null' for ref types when put into array initializer
- Bugzilla 21073: Rebindable does not work when class has alias this to inout property
- Bugzilla 21380: A case of compiler crash when using auto ref
- Bugzilla 21414: Spurious "non-constant expression" error with immutable constructors
- Bugzilla 21438: Compiler segfault on static array in a struct at CTFE
- Bugzilla 22004: [REG2.097] Error: mismatched function return type inference of void and noreturn
- Bugzilla 22151: Compiler crash when attempting to assign to function
- Bugzilla 22300: [REG 2.098-rc.2] -checkaction=context of a shared type with an opCast fails to compile
- Bugzilla 22385: CTFE fails to iterate over associative array previously indexed with implicit conversion to enum base type
- Bugzilla 22410: [REG2.094] function with tuple parameter with default argument fails if there's a qualifier
- Bugzilla 22420: [REG2.098] Apparent CTFE regression wrt. alias this
- Bugzilla 22472: Invalid error message for void return from non-void functions
- Bugzilla 22512: importC: incomplete array type must have initializer
- Bugzilla 22514: Invalid duplicate case error when the switched value has errors
- Bugzilla 22516: Segfault for function literal in struct initializer with previous errors
- Bugzilla 22529: wrong deprecation about empty statement
- Bugzilla 22558: [REG 2.098] Error: function 'core.stdc.stdio.vfprintf' 'pragma(printf)' functions must be 'extern(C) int vfprintf([parameters...], const(char)*, va_list)'
- Bugzilla 22570: more arguments than fields allowed in struct constructor
- Bugzilla 22584: importC: Error: undefined reference to 'parameter' when no parameter names in forward declaration
- Bugzilla 22585: importC: Error: variable 'var' extern symbols cannot have initializers
- Bugzilla 22592: importC: Segmentation fault indexing global array at run-time
- Bugzilla 22593: ICE on overloaded constructors
DMD Compiler bug fixes
- Bugzilla 16579: ReturnStatement[CallExp(DotVarExp)]: Corrupted runtime on missed manifest constant propagation
- Bugzilla 18054: Wrong cast of float constant to bool
- Bugzilla 19660: 'export' keyword on OSX/Linux globals causing segfaults
- Bugzilla 21093: [ICE] AssertError@dmd/optimize.d(691): Assertion failure
- Bugzilla 21794: Internal compiler assertion
- Bugzilla 21930: ICE (illegal instruction) with bad code
- Bugzilla 21950: cod1: Assertion failure for noreturn parameter
- Bugzilla 21952: ice for global / tls variable of type noreturn
- Bugzilla 21957: ice when dmd computes the alignment of an union containing a noreturn
- Bugzilla 22104: importC: Parser accepts arrays with incomplete element types
- Bugzilla 22315: ImportC: #pragma pack is not implemented
- Bugzilla 22323: Link error for virtual destructor of C++ class in DLL
- Bugzilla 22362: ImportC: error parsing compound literal with more than one value at function scope.
- Bugzilla 22375: importC: Error: C non-array initializer not supported yet
- Bugzilla 22376: importC: Error: cannot use non-constant CTFE pointer in an initializer
- Bugzilla 22388: Wrong overload selected for @safe delegate
- Bugzilla 22389: noreturn functions are allowed to return normally
- Bugzilla 22398: importC: Error: unknown, when compiling source with non-constant initializer.
- Bugzilla 22399: importC: Error: static variable cannot be read at compile time
- Bugzilla 22400: importC: Error: unknown, when compiling source with typedef'd initializer
- Bugzilla 22402: importC: Error: can't subtract '__tag2[1]' from pointer
- Bugzilla 22403: importC: Error: cannot pass argument '0' of type 'int' to parameter 'const(char)*'
- Bugzilla 22405: importC: Error: cannot modify 'const' expression '(*s).field'
- Bugzilla 22406: importC: Error: 'switch' statement without a 'default'; use 'final switch' or add 'default: assert(0);' or add 'default: break;'
- Bugzilla 22407: importC: Error: cannot implicitly convert expression of type 'extern (C) int(int a)' to 'const(extern (C) int function(int))'
- Bugzilla 22409: importC: [ICE] Error: struct no size because of forward reference
- Bugzilla 22411: importC: Error: cannot implicitly convert expression of type 'const(char*)' to 'char*'
- Bugzilla 22413: importC: Error: array index 0 is out of bounds
- Bugzilla 22422: ImportC: parse gnu attributes after a function parameter
- Bugzilla 22428: importC: static variables/functions emit global symbols
- Bugzilla 22432: ImportC: casting result of postfix operator on a parenthesized expression to a typedef’d type is parsed incorrectly
- Bugzilla 22461: OpenBSD: Use fmodl
- Bugzilla 22462: OpenBSD: bash lives in /usr/local
- Bugzilla 22463: OpenBSD: Allow DMD to work on 32-bit OpenBSD
- Bugzilla 22500: ImportC: Lots of errors when compiling tomlc99
- Bugzilla 22513: ImportC: address of member of struct can’t be taken at compile time.
- Bugzilla 22517: [REG 2.093][ICE] Bus error at dmd/lexer.d:398
- Bugzilla 22530: Explicit cast between classes incorrectly goes through 'alias this' inside CTFE
- Bugzilla 22531: importC: D name mangling applied to forward declaration of function inside function
- Bugzilla 22534: ImportC: const pointer (not pointer to const) is treated as transitive const
- Bugzilla 22538: importC: function 'func' conflicts with function 'func' when using static in forward declaration
- Bugzilla 22549: importC: float literal should support leading zero
- Bugzilla 22560: ImportC: extra semicolon not allowed outside of functions
- Bugzilla 22573: DMD compiler errors on Illumos/Solaris
- Bugzilla 22576: ImportC: cannot implicitly convert expression S(0) of type S to int in an S array
- Bugzilla 22577: ImportC: decay of function to typedef'd const function pointer causes ICE.
- Bugzilla 22589: importC: Error: undefined reference to '__builtin_va_start' and '__builtin_va_end'
- Bugzilla 22591: importC: Debug information for C sources have DW_AT_language set to D.
- Bugzilla 22597: importC: Segmentation fault initializing va_list with __builtin_va_start
- Bugzilla 22602: importC: Error: cannot convert string literal to 'void*'
DMD Compiler enhancements
- Bugzilla 22474: OpenBSD: Add support to test/runnable/dhry.d
- Bugzilla 22475: OpenBSD: Disable test/compilable/cdcmp.d on OpenBSD
- Bugzilla 22476: OpenBSD: Add OpenBSD to the fail_compilation/fail21227_win.d ignore list
- Bugzilla 22477: OpenBSD: Add to fail_compilation/fail3753.d ignore list
- Bugzilla 22478: OpenBSD: Add to fail_compilation/invalid_lib.d
Phobos regression fixes
- Bugzilla 16705: [REG2.069] TaskPool.reduce fails to compile "cannot get frame pointer to D main"
Phobos bug fixes
- Bugzilla 22458: OpenBSD: Add OpenBSD to std/system.d OS list
- Bugzilla 22487: Array!T.init.data crashes
Phobos enhancements
- Bugzilla 22393: OpenBSD: Add polyImpl implementation for x86
- Bugzilla 22488: data should work with const/immutable Array's
- Bugzilla 22511: Nullable is not copyable when templated type has elaborate copy ctor
- Bugzilla 22557: std.traits.fqnType is missing support for typeof(null)
Druntime regression fixes
- Bugzilla 21656: [REG2.091] Wrong file read during exception stringification leads to SIGBUS
- Bugzilla 22210: std.meta.allSatisfy in mutual recursion classes cannot be compiled
- Bugzilla 22235: core.demangle does not support noreturn
Druntime bug fixes
- Bugzilla 21919: darwin: SEGV in core.thread tests on OSX 11
- Bugzilla 22416: Unify polyImpl implementations
- Bugzilla 22440: OpenBSD: Sync sysctl.d
- Bugzilla 22443: OpenBSD: Fix Fiber support by adding MAP_STACK
- Bugzilla 22453: OpenBSD: Add a dummy value for AI_V4MAPPED
- Bugzilla 22455: Remove useless conditional assignment of DISABLED_TESTS in posix.mak
- Bugzilla 22456: OpenBSD: timer_* functions don't exist on OpenBSD
- Bugzilla 22485: OpenBSD: Fix core.sys.openbsd.unistd imports
Druntime enhancements
- Bugzilla 22395: OpenBSD: Add more OpenBSD-specific function prototypes in string.d and unistd.d
- Bugzilla 22439: OpenBSD: Sync mman.d
- Bugzilla 22448: OpenBSD: Add OpenBSD-specific alloc and free function prototypes from stdlib.h
- Bugzilla 22454: OpenBSD: Add prototypes for pthread_np.h
- Bugzilla 22457: OpenBSD: enableDwarf in opApply in runtime.d
- Bugzilla 22542: Explicitly cast backtrace results to int
- Bugzilla 22545: OpenBSD: Always use system backtrace
Contributors to this release (18)
A huge thanks goes to all the awesome people who made this release possible.
- Ate Eskola
- Boris Carvajal
- Brian Callahan
- Dennis
- dkorpel
- Florian
- Iain Buclaw
- lucica28
- Martin Kinkelin
- Martin Nowak
- Max Haughton
- MoonlightSentinel
- Per Nordlöw
- Razvan Nitu
- Tim Schendekehl
- Tomoya Tanjo
- Walter Bright
- Ömer Faruk IRMAK
Copyright © 1999-2023 by the D Language Foundation | Page generated by
Ddoc on Wed Mar 1 14:57:14 2023


ARIA-HIDDEN Tests
1. Static text, all hidden with aria-hidden="true"
This is test 1
2. Static text, partly hidden with aria-hidden="true"
This is test 2, this text is hidden, this text is not
3. Static text, content added with :before hidden with aria-hidden="true"
This is test 3,
4. Focusable control, hidden with aria-hidden="true"
5. Focusable control, contents hidden with aria-hidden="true"
6. Focusable control, contents hidden partly with aria-hidden="true"
7. Focusable control, content added with :before hidden with aria-hidden="true"
8. aria-hidden="false" nested in aria-hidden="true"
This content should be hidden.
This nested content should not be hidden


Triggers a sound effect
More...
|
| | SoundTrigger (SoundEffect sound) |
| | Initializes a new instance of the T:MB2D.SoundTrigger class using the specified SoundEffect More...
|
| |
| void | Trigger () |
| | Plays the sound if it's not already playing More...
|
| |
| void | Cut () |
| | Stops the sound if it's playing More...
|
| |
| void | FadeUp () |
| | Increases the sounds volume one step based on the specified FadeSpeed More...
|
| |
| void | FadeDown () |
| | Decreases the volume based on the specified FadeSpeed. Stops the sound once the volume reaches 0 More...
|
| |
|
| float | FadeSpeed [get, set] |
| | Gets or sets the fade speed. More...
|
| |
| float | MaxVolume [get, set] |
| | Determines the maximum volume to FadeUp More...
|
| |
| bool | IsLooped [get, set] |
| | Gets or sets a value indicating whether this T:MB2D.SoundTrigger is looped or one-shot. More...
|
| |
§ SoundTrigger()
| MB2D.SoundTrigger.SoundTrigger |
( |
SoundEffect |
sound | ) |
|
|
inline |
Initializes a new instance of the T:MB2D.SoundTrigger class using the specified SoundEffect
- Parameters
-
§ Cut()
| void MB2D.SoundTrigger.Cut |
( |
| ) |
|
|
inline |
Stops the sound if it's playing
§ FadeDown()
| void MB2D.SoundTrigger.FadeDown |
( |
| ) |
|
|
inline |
Decreases the volume based on the specified FadeSpeed. Stops the sound once the volume reaches 0
§ FadeUp()
| void MB2D.SoundTrigger.FadeUp |
( |
| ) |
|
|
inline |
Increases the sounds volume one step based on the specified FadeSpeed
§ Trigger()
| void MB2D.SoundTrigger.Trigger |
( |
| ) |
|
|
inline |
Plays the sound if it's not already playing
§ FadeSpeed
| float MB2D.SoundTrigger.FadeSpeed |
|
getset |
Gets or sets the fade speed.
The fade speed.
§ IsLooped
| bool MB2D.SoundTrigger.IsLooped |
|
getset |
Gets or sets a value indicating whether this T:MB2D.SoundTrigger is looped or one-shot.
true
if is looped; otherwise, false
.
§ MaxVolume
| float MB2D.SoundTrigger.MaxVolume |
|
getset |
Determines the maximum volume to FadeUp
The max volume.
The documentation for this class was generated from the following file:
- MB2D/src/Audio/SoundTrigger.cs


DuxForm saves form state in the Redux store in the root forms
object. A reducer is used in the
application's root reducer to manage the form state. See the Getting Started topic for more
information.
Beneath the form
object, an object is created for each <DuxForm>
component in the
application. Each form's object is created when its <DuxForm>
component is initialized. Within
that object, valid
, pristine
, and error
properties are created to reflect state for the form as
a whole. valid
is true as long as every field in the form is valid (see the Validation topic) and
pristine
is true as long as all fields in the form are pristine (their values are not modified). A
fields
object is also created. Beneath that, objects are created for each field in the form. The
properties for each field are detailed later. An typical Redux store might look like the following.
forms: { exampleform: { fields: { username: { pristine: false, value: "John Doe", error: "", valid: true, hasFocus: true }, email: { pristine: true, value: "", error: "Email is missing", valid: false, hasFocus: false } }, pristine: false, valid: false, error: "" }, otherform: { ... }, yetanotherform: { ... } }
In this example, the form is named "exampleform"
with two fields: "username"
and
"email"
. The cursor is currently in the username field and the user has typed some text. The email
field is still empty and is invalid, making the entire form invalid. Since the user has typed something in the
first field, it is not pristine, making the entire form not pristine.
Each field object stores properties for that field. These properties are updated as the user interacts with the
form. Some of these properties are used internally by <DuxForm>
and <DuxInput>
and are considered read-only. Others are updated by the components but can be changed in order to feed information
back into the form. The following properties are maintained for each field.
| Property | Description |
|---|---|
| pristine | True if the field has not been changed from the default value. This includes typing by the user, pasting into the field, or programatically changing the value. |
| value |
The current value of the field. For dataType="num" fields, this is a native JavaScript
integer or floating point value. For dataType="data" fields, this is a JavaScript Date
object.
|
| error | For field validation, this is an error message. |
| valid | For field validation, this is true or false to indicate validity. If no validation callback is specified, this value is always true. See the Validation topic for more information. |
| hasFocus | True if the field has current focus. |


| WinAPI Wrapper |
The Socket class simplifies the use of BSD sockets (Windows Sockets 2).
The Socket class has the following functions:
| Function | Related WinAPI function | Description |
|---|---|---|
| Socket | socket | Creates an empty socket, a socket object from an existing socket handle or a new socket using socket function. |
| operator= | - | Moves socket handle from one object to another. |
| ~Socket | shutdown closesocket | Calls Close() |
| IsValid | - | Checks whether the socket handle is valid. |
| GetError | errno | Returns error code after the last socket operation failed. |
| Bind | bind | Binds an address to the socket. |
| Connect | connect | Makes connection to a specified address/port pair. |
| GetPeerName | getpeername | Returns address (name) to which the socket is connected. |
| GetSockName | getsockname | Returns socket's address (name). |
| Listen | listen | Waits for an incoming connection. |
| Accept | accept | Accepts an incoming connection making a new socket with the connection. |
| Select | select | Waits until there is anything to read from the socket (any data has been received). |
| Send | send | Sends data over a connection. |
| Receive | recv | Receives data sent over a connection. |
| SendTo | sendto | Sends data to a specified address/port without a connection, |
| ReceiveFrom | recvfrom | Receives data on a nonconnected socket. |
| SetBlocking | WSAIoctl | Puts socket into a blocking or nonblocking state. |
| Close | shutdown closesocket | Shuts down a connection and destroys the socket. |
WinAPI Wrapper, WinAPI Wrapper classes, Windows Sockets Overview, Socket Functions


This Way Up:
design from different perspectives
design from different perspectives
Thinking inside the box since 2015.
A pop up shop brought to you by second year BA Graphic Design students at Central Saint Martins.
Explore the design perspectives of 80 students through 800 limited edition objects and experiences.


-
Growth hacking: hype or the holy grail for startups?  It was November 2007, and the executive in charge of Facebook’s platform and monetisation had a full-blown ...
-
LinkedIn's CEO Jeff Weiner Reveals The Importance Of Body Language, ...
www.businessinsider.com
Who is the best CEO in the country? According...
-
Underground vaults, offline servers, and armed guards: this is the Fort ...
www.theverge.com
Meet Wences Casares, the entrepreneur trying to bring bitcoin to the masses through extreme security.
-
Okta Names CA Technologies Exec Wittman as New CMO
recode.net
It's Okta's second senior hire this year.
-
Pixar Vets Reinvent Speech Recognition So It Works for Kids | WIRED
www.wired.com
Oren Jacob and his daughter Tobey had just finished Skyping with some family members when his daughter, then 7-years-old, picked up Jacob’s phone and ...
-
Microsoft & Minecraft
lilly.tumblr.com
Sometimes 140 characters isn’t quite enough to have a nuanced back & forth. A few minutes ago I tweeted that the more I think about it, the more I ...
-
Pure Hires Its CFO, Completing our Management Team | Pure Storage Blog
www.purestorage.com
The all-flash array for every enterprise
-
a feast in the forest.
www.sfgirlbybay.com
when you live in a big city and someone invites you to an evening at a cabin in the woods, you say, "yes, please!". which is what i was fortunate to ...
-
Our Investment in EatWith. The Dinner Table as the Original Social Network.
medium.com
By Simon Rothman
-
Docker Said to Be Valued at $400 Million in Funding Round
www.businessweek.com
Docker Inc., a developer of software that makes it easier to run programs on multiple computers and networks, has raised $40 million in funding that ...
-
greylock hackfest 2014
www.youtube.com
The third annual greylock hackfest was hosted at Medium in San Francisco from July 19-20, 2014. The hackfest featured some of the brightest minds in ...
-
Celebrate Good Neighbors this September in Honor of National Good Neighbor ...
blog.nextdoor.com
At Nextdoor, we’re passionate about being good neighbors, and we know our members are too! Every day, we hear inspiring and touching stories about ...
-
Internet Brands Acquires High Gear Media
www.marketwired.com
LOS ANGELES, CA--(Marketwired - Sep 3, 2014) - Internet Brands announced today that it has acquired High Gear Media, a next-generation publisher of ...
-
Workday Q&A: COO Talks Oracle, SAP - InformationWeek
www.informationweek.com
Workday COO Mike Stankey claims his firm has a three- to five-year tech lead on Oracle and SAP because the cloud is more than a destination and a ...
-
Enterprise Associate
www.linkedin.com
Greylock is seeking an Associate or Senior Associate (DOE) to join the firm’s enterprise software team. This is a 2-3 year position with the goal of ...
-
Wrangling for Tableau | Trifacta
www.trifacta.com
With the release of Trifacta 1.5, we have added the ability to write the output of Trifacta data transformations directly to a Tableau Data Extract ...
-
Docker & VMware: 1 + 1 = 3 | Docker Blog
blog.docker.com
Today at VMworld we’re excited to announce a broad partnership with VMware. The objective is to provide enterprise IT customers with joint solutions ...
-
Bits and bytes in intelligence Umbrella from OpenDNS
www.scmagazine.com
Umbrella from OpenDNS, a cloudbased network security service, is easy to use and an excellent intelligence resource.
-
For Big-Data Scientists, ‘Janitor Work’ Is Key Hurdle to Insights - ...
www.nytimes.com
Technology revolutions come in measured, sometimes foot-dragging steps. The lab science and marketing enthusiasm tend to underestimate the ...
-
The anti-Facebook: one in four American neighborhoods are now using this ...
www.theverge.com
It was early in the morning when the flooding hit The Knolls, a neighborhood of about 500 homes in Columbus, Ohio. The sewer overflowed, dumping a ...
-
SmartThings, Samsung, and the Future of the Connected Home
medium.com
It’s hard to believe that only 9 months ago we invested in SmartThings. Today it’s only become more apparent to us — and…
-
Internet of Bling: Samsung Buys SmartThings for $200 Million
recode.net
Another big scoops up an Internet of Things company to play in the fast-growing home automation space.
-
AppDynamics Announces Another Record Quarter of Growth With Increase in ...
finance.yahoo.com
AppDynamics, the application intelligence leader for the software-defined business, today announced another quarter of spectacular growth during its ...
-
Are We Approaching Peak App Overload? A Q&A With Greylock's John Lilly ...
recode.net
Some app splits make sense. Others, not so much.
-
Varney & Company with Stuart Varney
www.foxbusiness.com
Varney & Company on FoxBusiness.com - follow Stuart Varney, Charles Payne and Tracy Brynes weekdays 11 AM - 1 PM ET on Fox Business Network as this ...
-
How To Lead With Tough Love
www.fastcompany.com
Nextdoor cofounder Sarah Leary shares how her company grows and adapts by guiding people out of their comfort zone.
-
"Best Practices for UX/Product Integration" Ian Spalter, Ignite at ...
www.youtube.com
Ian Spalter, UX Lead and Manager at YouTube, gives an ignite presentation titled "Best Practices for UX/Product Integration" at #ProductSF on June ...


name
Your name needs to be unique. Go ahead and use spaces and special characters.
`
email address
Use the email account in which you received the invitation
password
create account


{{Wiktionary|dip}}
Dip may refer to: {{TOC_right}}
Contents |
DIP may refer to:
<!--* Discover Intensive Phonics for Yourself--> <!--* Dissemination Information Package, used in digital libraries--> <!--* Digital intellectual property--> <!--* Distributed IP NAT--> <!--* Draw Indexed Primitives, DirectX function-->
{{Disambig}}


Oops, I Did it Again: US F-16 Jet Accidentally Drops Dummy Bomb in Japan
TOKYO (Sputnik) - A US F-16 fighter jet accidentally dropped a dummy bomb during a training flight in Japan's northern Aomori prefecture that was later found on private land outside the training grounds, the command of the US forces in Japan (USFJ) said on Thursday.
"While conducting training, an F-16 at Misawa [Air Base] released a device 5 kilometres [3 miles] from the Draughon range late Wednesday. The cause of the incident is still under investigation, and USFJ notified GOJ [Government of Japan] this morning in accordance with all agreements", the command said on Twitter.
According to the US military, there have been no reports of injuries or damage.
Similar incidents involving US military aircraft stationed in Japan have happened in recent years. In particular, at least two helicopters made emergency landings in residential areas of Okinawa prefecture, and a 10-year-old student suffered a minor injury after a helicopter window fell onto a local school.
In a more serious incident, three servicemen were killed off the coast of Okinawa when a C2-A aircraft with 11 people on board crashed into the Pacific Ocean in November 2017. A month earlier, a CH-53 helicopter made an emergency landing on private property before bursting into flames.


Accordion Widget Builder
Please paste the URL of your Accordion Document.
Next
Choose Accordion Color
Silver
Blue
Sky Blue
Green
Orange
Red
Back
Choose Accordion Initial State
All panels collapsed
First panel expanded
All panels expanded
Back
Next
Copy this code:
and paste it into an HTML Widget on your Overview page"
Back
Start Over


Trust Motors
Dashboard
Add vehicle
Add event
Logout
Back to Dashboard
Vehicle Parts
Updating a part of the vehicle...
Type
Reference
Ready to Leave?
×
Select "Logout" below if you are ready to end your current session.


Yusif Ali Abdi, with an address at Charleville Road, Phibsboro, Dublin 7 is charged with murdering 20-month-old Nathan Baraka Andrew Ali at The Elms, College Road, Clane, Co Kildare on April 17th, 2001.
Wearing a white jacket over a grey suit, Mr Abdi stood up when arraigned before the Central Criminal Court on Monday morning.
When the registrar read the indictment to the accused and asked him how he was pleading, he replied: “Not guilty”.
A jury of seven men and five women was sworn in to hear the trial, which is due to begin on Tuesday morning before Mr Justice Alexander Owens and is expected to last up to five days.
Addressing the jury on Monday, Mr Justice Michael White said this was a “restricted form of trial”, which centred on the issues of sanity and insanity.
Mr Justice White told the jury they would primarily be concentrating on the medical witnesses and the defence would be calling two psychiatric consultants.


|
| Local Properties | ||
| Managed Object Types | Data Object Types | All Properties | All Methods |
All fields are optional. If you set the modify
parameter to true
when you call
ReconfigureComputeResource_Task, an unset property has no effect
on the existing property value in the cluster configuration on the Server.
If you set the modify
parameter to false
when you
reconfigure a cluster, the cluster configuration is reverted to the default
values, then the new configuration values are applied.
Use the properties defined for this object to configure the following services:
When it chooses a failover host, HA selects a host that is compatible with the virtual machine and that can support resource allocation for that virtual machine so that service level guarantees remain intact. HA does not consider hosts that are in maintenance mode, standby mode, or which are disconnected from the vCenter Server. When a host powers on or becomes available again, HA is reenabled on that host, so it becomes available for failover again. VMware recommends that you configure hosts and virtual machines so that all virtual machines can run on all hosts in the cluster. This will maximize the chances of restarting a VM after a failure.
HA also restarts a virtual machine after a guest operating system failure. In this case, the virtual machine health monitoring service detects the guest failure, and HA restarts the virtual machine on the same host. The service monitors heartbeats from the VmTools service and optionally heartbeats that are generated by a third-party application monitor. See ClusterVmToolsMonitoringSettings and ClusterDasConfigInfo.vmMonitoring.
To enable HA for a cluster, set the
ClusterDasConfigInfo.enabled
property to true
and the
ClusterDasConfigInfo.hostMonitoring
property to enabled.
(The vSphere API uses the substring "das" in object, property,
and method names for HA.1)
To enable DRS for a cluster, set the
ClusterDrsConfigInfo.enabled
property to true
.
To enable DPM for a cluster, set the
ClusterDpmConfigInfo.enabled
property to true
.
true
for vsanConfig.
To enable InfraUpdateHA for a cluster, set the
ClusterInfraUpdateHaConfigInfo.enabled property to
true
.
To enable ProactiveDRS for a cluster, set the
ClusterProactiveDrsConfigInfo.enabled property to
true
.
The HA, DRS, and DPM services are integrated with the FT (Fault Tolerance) and EVC (Enhanced vMotion Compatibility) services. Use the CreateSecondaryVM_Task method to establish fault tolerance for a virtual machine. Use the vSphere Client to configure EVC. The HA, DRS, DPM, FT, and EVC services interact under the following circumstances.
das.maxFtVmsPerHost
to the desired number or to zero to disable.
When admission control is disabled, failover resource constraints are not passed on to DRS and DPM. The constraints are not enforced.
If EVC is disabled, vCenter automatically creates overrides to disable DRS for FT primary/secondary pairs in the cluster. vCenter will still use DRS to place a secondary virtual machine when it powers on. Attempts to remove the overrides or to enable DRS operations will fail.
Properties
| Name | Type | Description |
|---|---|---|
| dasConfig* | ClusterDasConfigInfo |
HA configuration; includes default settings for virtual machines.
|
| dasVmConfigSpec* | ClusterDasVmConfigSpec[] |
HA configuration for individual virtual machines.
The entries in this array override the cluster default
settings
(ClusterDasConfigInfo.defaultVmSettings).
You cannot specify an HA override for a secondary FT virtual
machine. The secondary virtual machine will inherit whatever
settings apply to its primary virtual machine. If you
include an entry for a secondary, the reconfigure method
will throw the fault
CannotChangeHaSettingsForFtSecondary.
|
| dpmConfig* | ClusterDpmConfigInfo |
DPM configuration; includes default settings for hosts.
|
| dpmHostConfigSpec* | ClusterDpmHostConfigSpec[] |
DPM configuration for individual hosts.
The entries in this array override the cluster default
settings
(ClusterDpmConfigInfo.defaultDpmBehavior).
|
| drsConfig* | ClusterDrsConfigInfo |
DRS configuration; includes default settings for virtual machines.
|
| drsVmConfigSpec* | ClusterDrsVmConfigSpec[] |
DRS configuration for individual virtual machines.
The entries in this array override the cluster default
settings
(ClusterDrsConfigInfo.defaultVmBehavior).
You cannot specify a DRS override for a secondary FT virtual
machine. The secondary virtual machine will inherit whatever
setting applies to its primary virtual machine. If you
include an entry for a secondary, the reconfigure method
will throw the fault
CannotChangeDrsBehaviorForFtSecondary.
|
| groupSpec* | ClusterGroupSpec[] |
Cluster-wide group configuration.
The array contains one or more group specification objects.
A group specification object contains a virtual machine group
(ClusterVmGroup) or a host group (ClusterHostGroup).
Groups can be related; see ClusterVmHostRuleInfo.
Since vSphere API 4.1 |
| infraUpdateHaConfig* | ClusterInfraUpdateHaConfigInfo |
InfraUpdateHA configuration.
Since vSphere API 6.5 |
| inHciWorkflow* | xsd:boolean |
Flag to place the cluster in the HCI workflow during cluster creation.
This flag is specified only at the time of cluster creation.
A cluster cannot be reconfigured to place it in the HCI workflow.
Since vSphere API 6.7.1 |
| orchestration* | ClusterOrchestrationInfo |
Cluster configuration of VM orchestration.
Since vSphere API 6.5 |
| proactiveDrsConfig* | ClusterProactiveDrsConfigInfo |
ProactiveDrs configuration.
Since vSphere API 6.5 |
| rulesSpec* | ClusterRuleSpec[] |
Cluster affinity and anti-affinity rule configuration.
|
| vmOrchestrationSpec* | ClusterVmOrchestrationSpec[] |
List of specific VM configurations that apply during cluster wide
VM orchestration. Each entry applies to one virtual machine, and
overrides the cluster default settings.
Since vSphere API 6.5 |
| vsanConfig* | VsanClusterConfigInfo |
VSAN configuration; includes default settings for hosts.
Since vSphere API 5.5 |
| vsanHostConfigSpec* | VsanHostConfigInfo[] |
VSAN configuration for individual hosts.
The entries in this array override the cluster default settings
as specified in VsanClusterConfigInfo.
Since vSphere API 5.5 |
| Properties inherited from ComputeResourceConfigSpec | ||
| defaultHardwareVersionKey, spbmEnabled, vmSwapPlacement | ||
| Properties inherited from DynamicData | ||
| None |
| Top of page | Local Properties | ||
| Managed Object Types | Data Object Types | All Properties | All Methods |


---
layout: post
title: Chief Joseph surrenders
description: September 30, 1877. Chief Joseph handles his rifle after the Bear Paw Battle.
date: '2019-01-30 12:31:26 +0100'
categories:
- Storyboards
- Sketches
---
September 30, 1877. Chief Joseph handles his rifle to Gen.Oliver O. Howard and Col. Nelson Miles: “I will fight no more forever”.


|
Little Heroes
|
Inspector class used to edit UIWidgets. More...
Public Types | |
| enum | Action { Action.None, Action.Move, Action.Scale, Action.Rotate } |
Public Member Functions | |
| void | OnSceneGUI () |
| Draw the on-screen selection, knobs, and handle all interaction logic. More... | |
| void | DrawWidgetTransform () |
| Draw common widget properties that can be shown as a part of the Transform Inspector. More... | |
| Public Member Functions inherited from UIRectEditor | |
| override void | OnInspectorGUI () |
| Draw the inspector properties. More... | |
| void | DrawAnchorTransform () |
Static Public Member Functions | |
| static bool | Raycast (Vector3[] corners, out Vector3 hit) |
| Raycast into the screen. More... | |
| static void | DrawKnob (Vector3 point, bool selected, bool canResize, int id) |
| Draw a control dot at the specified world position. More... | |
| static float | GetScreenDistance (Vector3 worldPos, Vector2 mousePos) |
| Screen-space distance from the mouse position to the specified world position. More... | |
| static float | GetScreenDistance (Vector3[] worldPoints, Vector2 mousePos, out int index) |
| Closest screen-space distance from the mouse position to one of the specified world points. More... | |
| static void | SetCursorRect (Rect rect, MouseCursor cursor) |
| Set the mouse cursor rectangle, refreshing the screen when it gets changed. More... | |
| static Vector3[] | GetHandles (Vector3[] corners) |
| Convert the specified 4 corners into 8 pivot points (adding left, top, right, bottom – in that order). More... | |
| static UIWidget.Pivot | GetPivotUnderMouse (Vector3[] worldPos, Event e, bool[] resizable, bool movable, ref Action action) |
| Determine what kind of pivot point is under the mouse and update the cursor accordingly. More... | |
| static void | DrawAnchorHandle (UIRect.AnchorPoint anchor, Transform myTrans, Vector3[] myCorners, int side, int id) |
| Draw the specified anchor point. More... | |
| static void | DrawColor (SerializedObject so, UIWidget w) |
| Draw the widget's color. More... | |
| static void | DrawInspectorProperties (SerializedObject so, UIWidget w, bool drawColor) |
| Draw common widget properties. More... | |
| Static Public Member Functions inherited from UIRectEditor | |
| static void | UpdateHorizontalAnchor (UIRect r, UIRect.AnchorPoint anchor, bool resetRelative) |
| Convenience function that switches the anchor mode and ensures that dimensions are kept intact. More... | |
| static void | UpdateVerticalAnchor (UIRect r, UIRect.AnchorPoint anchor, bool resetRelative) |
| Convenience function that switches the anchor mode and ensures that dimensions are kept intact. More... | |
Static Public Attributes | |
| static new UIWidgetInspector | instance |
| static UIWidget.Pivot[] | pivotPoints |
| Static Public Attributes inherited from UIRectEditor | |
| static UIRectEditor | instance |
Protected Member Functions | |
| override void | OnDisable () |
| Clear the instance reference. More... | |
| override void | OnEnable () |
| Cache the reference. More... | |
| override void | DrawCustomProperties () |
| All widgets have depth, color and make pixel-perfect options More... | |
| override void | OnDrawFinalProperties () |
| Protected Member Functions inherited from UIRectEditor | |
| void | ReEvaluateAnchorType () |
| Manually re-evaluate the current anchor type. More... | |
| virtual bool | ShouldDrawProperties () |
| virtual void | DrawFinalProperties () |
| Draw the "Anchors" property block. More... | |
| SerializedProperty | DrawSingleAnchorSelection () |
| Draw a selection for a single target (one target sets all 4 sides) More... | |
| void | DrawAnchor (int index, bool targetSelection) |
| Helper function that draws the suffix after the relative fields. More... | |
| void | UpdateAnchors (bool resetRelative) |
| Convenience function that switches the anchor mode and ensures that dimensions are kept intact. More... | |
| void | UpdateAnchor (int index, bool resetRelative) |
| Convenience function that switches the anchor mode and ensures that dimensions are kept intact. More... | |
Protected Attributes | |
| UIWidget | mWidget |
| Protected Attributes inherited from UIRectEditor | |
| AnchorType | mAnchorType = AnchorType.None |
| Transform[] | mTarget = new Transform[4] |
| bool[] | mCustom = new bool[] { false, false, false, false } |
Static Protected Attributes | |
| static bool | mUseShader = false |
| Static Protected Attributes inherited from UIRectEditor | |
| static string[] | PrefixName = new string[] { "Left", "Right", "Bottom", "Top" } |
| static string[] | FieldName = new string[] { "leftAnchor", "rightAnchor", "bottomAnchor", "topAnchor" } |
| static string[] | HorizontalList = new string[] { "Target's Left", "Target's Center", "Target's Right", "Custom", "Set to Current Position" } |
| static string[] | VerticalList = new string[] { "Target's Bottom", "Target's Center", "Target's Top", "Custom", "Set to Current Position" } |
| static bool[] | IsHorizontal = new bool[] { true, true, false, false } |
Properties | |
| static Color | handlesColor [get] |
| Color used by the handles based on the current color scheme. More... | |
Additional Inherited Members | |
| Protected Types inherited from UIRectEditor | |
| enum | AnchorType { AnchorType.None, AnchorType.Unified, AnchorType.Advanced } |
| Static Protected Member Functions inherited from UIRectEditor | |
| static bool | IsCommon (float relative) |
| Whether the specified relative offset is a common value (0, 0.5, or 1) More... | |
| static bool | IsRect (SerializedProperty sp) |
| Returns 'true' if the specified serialized property reference is a UIRect. More... | |
| static UIRect | GetRect (SerializedProperty sp) |
| Pass something like leftAnchor.target to get its rectangle reference. More... | |
| static Camera | GetCamera (SerializedProperty sp) |
| Pass something like leftAnchor.target to get its rectangle reference. More... | |
Inspector class used to edit UIWidgets.
|
static |
Draw the specified anchor point.
|
static |
Draw the widget's color.
|
protectedvirtual |
All widgets have depth, color and make pixel-perfect options
Reimplemented from UIRectEditor.
|
static |
Draw common widget properties.
|
static |
Draw a control dot at the specified world position.
| void UIWidgetInspector.DrawWidgetTransform | ( | ) |
Draw common widget properties that can be shown as a part of the Transform Inspector.
|
static |
Convert the specified 4 corners into 8 pivot points (adding left, top, right, bottom – in that order).
|
static |
Determine what kind of pivot point is under the mouse and update the cursor accordingly.
|
static |
Screen-space distance from the mouse position to the specified world position.
|
static |
Closest screen-space distance from the mouse position to one of the specified world points.
|
protectedvirtual |
Clear the instance reference.
Reimplemented from UIRectEditor.
|
protectedvirtual |
Reimplemented from UIRectEditor.
|
protectedvirtual |
Cache the reference.
Reimplemented from UIRectEditor.
| void UIWidgetInspector.OnSceneGUI | ( | ) |
Draw the on-screen selection, knobs, and handle all interaction logic.
|
static |
Raycast into the screen.
|
static |
Set the mouse cursor rectangle, refreshing the screen when it gets changed.
|
static |
|
staticprotected |
|
protected |
|
static |
|
staticget |
Color used by the handles based on the current color scheme.


Service Routing
Craig Tracey
Fundamental to the deployment of most software is the ability to route traffic to network services. This is especially true when the software platform adopts a microservices architecture.
Traditionally, exposing such services has been an arduous task. Concerns such as service discovery, port contention, and even load balancing were often left as an exercise for the operator. These capabilities were, no doubt, available, but were often configured and operated through manual user intervention.
Fortunately, Kubernetes provides a number of primitives that allow us to route service traffic across the cluster as well as from external sources. Just as all other Kubernetes resources, these are configured in a declarative way.
The Kubernetes Service Resource
The Kubernetes Service resource is a core API type that allows users to define how service endpoints may be exposed to client applications. This construct operates between layer 3 and 4 of the OSI networking stack. This resource, natively, offers three types of services that provide various levels of service exposure.
An example Service declaration may take the following form:
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: myapp
spec:
type: ClusterIP # this is the default value if unspecified
selector:
app: mysql
ports:
- protocol: TCP
port: 3307
targetPort: 3306
This Service will provide Layer 3/4 access to mysql Pods that are labeled with
the app: mysql
key-value pair within the myapp
namespace. While the Pod
exposes the service on the standard mysql port (3306), the Service may
selectively expose it on an alternate port (in this case, 3307).
Each of the Service types build on the previous type, beginning with ClusterIP as the most basic type.
ClusterIP
The ClusterIP Service type is used to expose a Pod’s layer 4 endpoint to the rest of the cluster. As stated earlier, this service type serves as the most basic of all of the types. This construct is namespaced, and has two primary functions: to provide a cluster-local virtual IP and an associated DNS entry. This virtual IP is pulled from an IP pool that is dedicated for all services, and once created it is used as the target for a consistent DNS record.
These DNS records take the fully-qualified form of:
<service name>.<namespace>.svc.cluster.local
From the example above, this record would take the form:
mysql.myapp.svc.cluster.local
These records may be used for service discovery from within the cluster. They may be used to address services across namespaces as well as within the same namespace. In the case of intra-namespace resolution, they may be addressed with just the short name of the record.
When a service type is not specified, ClusterIP is the default.
NodePort
NodePort services provide a mechanism for exposing services to external
entities. In this case, a high port will be opened on all Nodes in the cluster.
The range from which this port will be allocated may be specified through the
--service-node-port-range
kube-api-server
configuration parameter. The
default port range can be consulted in the
official documentation.
While a valid, unused port that falls within the range may be specified in the
declaration, the most common case calls for the port to be selected
automatically by Kubernetes itself.
When a NodePort service type is specified, this functionality will build upon the ClusterIP construct. In other words, when specified, NodePort will instantiate the functionality of both NodePort as well as ClusterIP. An external user will be able to address an in-cluster service by connecting to any single node in the cluster at the high port which has been dedicated to the service. Likewise, clients that originate their connection from within the cluster may utilize either the virtual IP and/or DNS entries provided by the ClusterIP functionality.
This functionality can be a critical component for exposing services to external clients, but it can be a bit cumbersome. An external client would need to know the IP address of cluster Nodes as well as the ephemeral high port that has been delegated to the Service. While custom service discovery mechanisms may be reliably configured with this ephemeral data, in the next section we will demonstrate how NodePort may be utilized to front Services with an external load balancer.
Node ports are opened on all Nodes within the cluster. Therefore, there is no
guarantee that your destination Pod is also colocated on that Node. Once the
traffic hits the Node port, it will be forwarded through the ClusterIP service
that may direct it to a Pod on another Node, even if a suitable Pod is running
on that Node. This behavior can be controlled by configuring your Service with
an externalTrafficPolicy
.
An externalTrafficPolicy
denotes if the traffic received is desired to be
routed to node-local or cluster-wide endpoints. The default value for this
parameter is Cluster
, which as described above will forward the NodePort
traffic to any Pod running in the cluster, even if it is running on a Node
different than the one receiving the traffic. When choosing Local
for this
setting, the client source IP is preserved and a second hop to another node is
avoided, but this potentially limits the load-spread across the cluster and
risks imbalanced traffic spreading.
LoadBalancer
The LoadBalancer Service type, again, builds on the foundation provided by the NodePort and ClusterIP functionality. When this type is specified, both in-cluster and external access is configured as outlined above. Additionally, an external load balancer will also be configured to front all of the NodePort services.
This Service type requires the cluster is built on top of infrastructure that provides load balancing functionality. Nearly all cloud IaaS providers (i.e. AWS, GCP, Azure, etc.), provide support for these services through Kubernetes cloud provider integrations. Additionally, there are third-party integrations (i.e. F5, NSX, etc.) that may also provide load balancing functionality that implements the Kubernetes Service resource.
Ingress
As web-based services continue to grow in popularity, whether those are user-facing interfaces or REST/GraphQL APIs, it is likely that these types of applications will constitute the majority of what gets deployed on an average cluster. With these types of applications, there are a number of features that are necessary for a production deployment. First and foremost, these applications will require redundancy, and this is typically achieved by deploying a number of discreet instances of the web-based application and, in turn, fronting these with a layer 7 proxy. This reverse proxy will register a number of upstream instances of the application, ensuring that each is reachable by way of a health check, and forwarding traffic to healthy upstreams according to the declared configuration.
These configurations will provide mechanisms for the traffic to be qualified by
a number of rules before it is forwarded on to the upstream instances of the
application. These rules for evaluation may include conditions such as the value
of the Host
header in the HTTP request, as well as the specific paths that are
being requested. Once a rule has evaluated to a known upstream, the traffic may
be passed as-is or forwarded on with specified modifications (i.e. header
changes, path rewrites, etc).
Kubernetes provides a mechanism for easy configuration of an in-cluster reverse
proxy deployment with its Ingress resource. This resource serves as a generic
configuration for nearly any reverse proxy. As Pods for a Service scale up or
down (again, these are determined by label selectors), the Ingress controller
will, in turn, add or remove the Pod’s IP from the pool of upstream Endpoints.
Endpoints for a Service may be queried with the kubectl get endpoints
command.
Some proxies, however, also provide functionality above and beyond what would be considered a common feature set. In this case, custom features may be supplemented with annotations on the resource.
In addition to specific implementation details, annotations may be utilized for adjacent and/or complementary functionality. For instance, with the cert-manager project, annotations are placed on an Ingress resource so that the reverse proxy may secure the deployment with TLS certificates.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
backend:
serviceName: test
servicePort: 80
As with any Kubernetes controller, a user may declare a desired state and the controller is responsible for reconciling that configuration towards that desired state. The case for Ingress controllers is no different. The controller will watch for any updates to the full collection of Ingress objects and, in turn, configure the reverse proxy to reflect the desired state. In the case of proxies such as nginx, this will amount to the controller writing a collection of nginx configuration files, and reloading the nginx service. Alternatively, with more modern proxies (e.g. Envoy managed by the Contour Controller), upstreams and other configurations may be manipulated with an API, and thus do not require reloads. This functionality is advantageous as it will not disrupt any in-flight connections.
Service Mesh
As mentioned earlier, natively, Kubernetes service routing is concerned with providing the layer 3 and 4 plumbing that will connect a client to a network service that is being served from within the cluster. There is, however, a desire amongst the industry to provide additional routing capabilities. While layer 3 and 4 can provide adequate mechanisms for connectivity, it is incapable of providing any data or features for application-centric concerns. As one extends into the higher layers, we can start to change the way we deploy and observe these applications.
Service mesh deployments make use of the native Kubernetes service constructs, but layer on features implemented with layers 5 through 7. Some of the features afforded by service mesh controllers include mutual TLS, tracing, circuit breaking, dynamic routing, rate limiting, load balancing, and more. This is typically implemented by placing lightweight proxies at application boundaries within the Kubernetes cluster. Specifically, in the case of projects like Istio this is accomplished by automatically attaching an Envoy proxy container to all Pods. Envoy, when deployed in this way, can provide the features mentioned above. This does, however, come at the price of additional resource utilization.
While service mesh implementations are relatively nascent in the wild, it is quickly becoming a must-have feature set. And, we fully expect that service mesh deployments will continue to expand in size and scope. Let’s review some of the common service mesh features.
Mutual TLS
Mutual TLS provides some very attractive features for application developers and platform operators alike. As with most deployments, there will be requirements for adhering to security constraints before going to production. One of the most popular requests is that all network traffic should be encrypted. While this may be achieved with some CNI implementations, many do not provide this type of overlay capability. Regardless of what the nature of our network fabric looks like, we can provide this capability seamlessly with a service mesh operating at layer 5 and 7 of the OSI model.
In addition to the requirement that all traffic be encrypted, mutual TLS also provides service-to-service identity. In other words, we can ensure that only services that we have been authorized to transact with one another may do so. Of course we can implement firewall policies that would also provide similar capabilities, but these are not nearly as advanced as what TLS can provide. Firewall rules merely indicate which IP and port combinations may initiate and complete connections. Mutual TLS, however, can ensure cryptographically which layer 7 connections will be able to be initiated and completed.
Tracing
In dynamic environments like Kubernetes, there is often a desire to understand how microservices are connected to one another. Not only are we concerned with what services speak to each other, we are also concerned with understanding to what degree they do so. How many connections are there, and how frequently? Or, are there some service-to-service connections that are slower than others?
Due to service mesh-placed proxies alongside the application, we can now automatically add Open Tracing headers to help us understand how services interact. And, this is precisely how tracing works with service mesh technologies: headers are placed on intra-service traffic, and may then be analyzed by tools such as Jaeger.
Circuit Breaking
Circuit breaking allows for advanced patterns concerning failure detection. Now, instead of relying on the, relatively simplistic, health checks offered by layer 3 and layer 4 (i.e. can we connect?), we can now programmatically remove upstreams based on more qualified data. Because service mesh operates at the application layer, we can add criteria concerning HTTP status codes, response times, number of pending requests and the like. Utilizing application data in this way helps to provide a better end-user experience.
Advanced Request Routing
Service mesh implementations also allow for routing traffic based upon policy that extend above and beyond what is capable with native Kubernetes constructs alone. Advanced patterns, such as canary, weighted, and/or blue/green deployments, are available through service mesh-specific resource types. Likewise, this capability also enables advanced development patterns. Users may be directed to specific application instances based on designated headers and even the request’s attached user identity.
Load Balancing
While Kubernetes Ingress controllers are implemented with load balancing reverse proxies, service mesh is capable of providing features above what is typically provided by these third-party controllers. Whereas most Ingress controllers are a bit limited with regard to how they maybe configured through the Ingress resource type, service mesh provides additional resource types that allow a user to be more expressive. Service mesh also typically provides for some advanced capabilities like locality-based balancing, with failover based upon priority designations.
Popular Tooling and Approaches
Ingress
NGINX Ingress Controller
The NGINX Ingress Controller is the most commonly deployed Ingress controller within the Kubernetes ecosystem. It is maintained in the open as a Kubernetes community project. It is built on the decades-old NGINX reverse proxy and, is therefore, well understood and a technology that many organizations have already operationalized and/or have familiarity with.
Pros:
- Broad adoption.
- Well-tested in production scenarios.
- Extends the Ingress resource with dozens of implementation-specific annotations.
- Functionality may be extended with Lua scripting.
Cons:
- Technology is not well-suited for highly dynamic environments.
- All Ingress changes require that NGINX reloads the process in order to apply the changes. This may have a detrimental impacts on in-flight connections.
Contour
Contour is an Ingress controller that is developed and maintained by VMware. Built on top of the Envoy proxy from Lyft. It offers a performant, cloud native solution for Ingress control.
Because Envoy is configurable via gRPC APIs, this means that new route configurations may be applied dynamically and without disrupting any in-flight connections.
Contour adds a Custom Resource Definition called HTTPProxy, which enables advanced capabilities that may not be expressed with Ingress normally. Features such as route delegation, multi-service routes, weighted endpoints, and load balancing strategies allow end users to craft highly-specific application rollout patterns, thus further enabling CI/CD.
Pros:
- Built on top of Envoy, a highly performant and scalable reverse proxy.
- Ingress configuration is applied via an API; not static configuration files.
- Extends Ingress control to support multi-team environments.
- HTTPProxy provides richer configuration than is available with the Ingress resource alone. Some of these extended features include weighted routes and specification of load balancing strategies without the use of annotations.
Cons:
- Relatively new within the ecosystem, only reaching GA recently.
- Features that already exist for other Ingress controllers may not yet be available for Contour.
Traefik
Traefik bills itself as the “Cloud Native Edge Router.” While we have seen limited numbers of deployments leveraging Traefik, it has often been utilized in cases where other solutions did not provide equivalent functionality. Specifically, features like header-based routing have been implemented with Traefik in the past, but as this functionality becomes more commonplace, the need for Traefik to fill this gap will likely diminish.
Traefik is supported by Containous and is developed as open source software.
Pros:
- Has some extended features that may not be available with other Ingress solutions.
- Seamless integrations with services such as Let’s Encrypt
- Full-featured dashboard
- Multi-platform support beyond Kubernetes alone.
- Docker
- Rancher
- Marathon
Cons:
- Has not seen strong traction within the community.
- Deep feature list, but configuration can be a bit complicated.
- Some Enterprise features are not open sourced.
Service Mesh
Linkerd
Linkerd is an ultra lightweight service mesh for Kubernetes. It provides end users with the features that they would expect from a service mesh solution: runtime debugging, observability, reliability, and security. Linkerd is a fully open source solution falling under the Apache 2 license.
Features:
- HTTP, HTTP/2, and gRPC Proxying
- TCP Proxying and Protocol Detection
- Retries and Timeouts
- Automatic mTLS
- Ingress
- Telemetry and Monitoring
- Automatic Proxy Injection
- Dashboard and Grafana
- Distributed Tracing
- Fault Injection
- High Availability
- Service Profiles
- Traffic Split (canaries, blue/green deploys)
Pros:
- Lightweight service mesh solution which requires absolutely no changes to application code.
- Contains all of the features that would be expected from a service mesh solution.
- Was one of the first service mesh options and is quite mature as a result.
- Recently rewritten in the aim of improving performance.
Cons:
- Linkerd doesn’t provide an Ingress Controller. The project documentation has information about integrating with Nginx, Contour, and others. This means Linkerd requires managing Ingress as additional operational overhead.
- Traffic splitting syntax can be cumbersome.
Istio
Istio is perhaps the most popular service mesh offering today. It is an open source project that is being maintained by Google, IBM, and Red Hat. Just as with Linkerd, it has dozens of features that one would expect to see in a service mesh solution.
Istio makes it easy to create a network of deployed services with load balancing, service-to-service authentication, monitoring, and more, with few or no code changes in service code. You add Istio support to services by deploying a special sidecar proxy throughout your environment that intercepts all network communication between microservices, then configure and manage Istio using its control plane functionality, which includes:
- Automatic load balancing for HTTP, gRPC, WebSocket, and TCP traffic.
- Fine-grained control of traffic behavior with rich routing rules, retries, failovers, and fault injection.
- A pluggable policy layer and configuration API supporting access controls, rate limits and quotas.
- Automatic metrics, logs, and traces for all traffic within a cluster, including cluster ingress and egress.
- Secure service-to-service communication in a cluster with strong identity-based authentication and authorization.
Pros:
- Istio has a huge amount of momentum behind it. It is currently the most popular service mesh offering on the market.
- It forms the basis of VMware’s NSX-SM solution.
- It is extraordinarily full-featured, but this also creates a large degree of complexity.
- Istio may be used as both an Ingress and a service mesh with the Ingress Gateway feature.
Cons:
- Istio does not have an open governance model. Its steering committee is run by IBM, Google, and Red Hat.
- Istio is in rapid development and many features are at various levels of stability, some of which may not be suitable for production.
- Configuration can be extraordinarily complex.
- You may be required to leverage the Istio ingress controller exclusively in order to leverage the features you are interested in.
- The complexity that Istio introduces to a Kubernetes deployment often mandates a team dedicated to its operation and support.